Marco Trudel writes: > Andrew Haley wrote: > > Marco Trudel writes: > > > Andrew Haley wrote: > > > > Marco Trudel writes: > > > > > Hey guys > > > > > > > > > > java.util.Arrays.binarySearch(Object[] a, Object key, Comparator > > c) > > > > > exchanges a[i] and key, this can lead to ClassCastExceptions as > > shown in > > > > > ComparatorTest.java. Arrays.patch fixes it. > > > > > > > > > > > > > > > Changelog suggestion: > > > > > > > > > > 2006-12-13 Marco Trudel <[EMAIL PROTECTED]> > > > > > > > > > > * classpath/java/util/Arrays.java (binarySearch(Object[] a, > > Object key, > > > > > Comparator c)): > > > > > Fix swapped objects inCollections.compare(...) call. > > > > > > > > > > > > > > > Comments? > > > > > > > > I guess I don't get it. Arrays.binarySearch() is defined to be > > > > searching for a key in an array. The comparator has to be able to > > > > compare keys and values. How is this not a bug in the test case? > > > > > > The key might be a different object that the values. The comparator > > > will then be responsible to see if they're equal. Thus the order is > > > important... > > > > OK, but where does it say that in the spec? > > Sorry, I did not read the spec.
What!! > This somehow seems logical to me. But why? Are you assuming that the key _must_ occur on the LHS of the Comparator? > Also this is a regression in classpath that was introduced with a > refactoring of binarySearch(...) and a Sun JVM does it the logical way > too. Even if it's considered unlogical, the swap wouldn't affect it > then... So I guess this is safe to commit. It's perfectly safe. You asked for comments. My comment is that your Comparator is broken, and that a perfectly correct comparator without the bug may be written: public int compare(Object o1, Object o2) { int i1 = Integer.parseInt(o1.toString()); int i2 = Integer.parseInt(o2.toString()); return (i1 == i2 ? 0 : (i1 < i2 ? -1 : 1)); } Andrew.