[ https://issues.apache.org/jira/browse/LUCENE-1502?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Michael McCandless resolved LUCENE-1502. ---------------------------------------- Resolution: Fixed Lucene Fields: [New, Patch Available] (was: [Patch Available, New]) Committed revision 732141. Thanks Shai! > CharArraySet behaves inconsistently in add(Object) and contains(Object) > ----------------------------------------------------------------------- > > Key: LUCENE-1502 > URL: https://issues.apache.org/jira/browse/LUCENE-1502 > Project: Lucene - Java > Issue Type: Bug > Components: Analysis > Reporter: Shai Erera > Assignee: Michael McCandless > Fix For: 2.4.1, 2.9 > > Attachments: LUCENE-1502.patch > > > CharArraySet's add(Object) method looks like this: > if (o instanceof char[]) { > return add((char[])o); > } else if (o instanceof String) { > return add((String)o); > } else if (o instanceof CharSequence) { > return add((CharSequence)o); > } else { > return add(o.toString()); > } > You'll notice that in the case of an Object (for example, Integer), the > o.toString() is added. However, its contains(Object) method looks like this: > if (o instanceof char[]) { > char[] text = (char[])o; > return contains(text, 0, text.length); > } else if (o instanceof CharSequence) { > return contains((CharSequence)o); > } > return false; > In case of contains(Integer), it always returns false. I've added a simple > test to TestCharArraySet, which reproduces the problem: > public void testObjectContains() { > CharArraySet set = new CharArraySet(10, true); > Integer val = new Integer(1); > set.add(val); > assertTrue(set.contains(val)); > assertTrue(set.contains(new Integer(1))); > } > Changing contains(Object) to this, solves the problem: > if (o instanceof char[]) { > char[] text = (char[])o; > return contains(text, 0, text.length); > } > return contains(o.toString()); > The patch also includes few minor improvements (which were discussed on the > mailing list) such as the removal of the following dead code from > getHashCode(CharSequence): > if (false && text instanceof String) { > code = text.hashCode(); > and simplifying add(Object): > if (o instanceof char[]) { > return add((char[])o); > } > return add(o.toString()); > (which also aligns with the equivalent contains() method). > One thing that's still left open is whether we can avoid the calls to > Character.toLowerCase calls in all the char[] array methods, by first > converting the char[] to lowercase, and then passing it through the equals() > and getHashCode() methods. It works for add(), but fails for contains(char[]) > since it modifies the input array. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: java-dev-unsubscr...@lucene.apache.org For additional commands, e-mail: java-dev-h...@lucene.apache.org