Marco Trudel writes: > Andrew Haley wrote: > > 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!! > > Shame on me! I was just debugging a ClassCastException on a library and > found that one to be the cause... > > > > This somehow seems logical to me. > > > > But why? Are you assuming that the key _must_ occur on the LHS of the > > Comparator? > > No. The point is that completely different objects might be passed which > have no relation with each other. A stupid example: > > Object[] o1 = { "22", "23", "24" }; > Object o2 = new java.awt.Button("2"); > > And then the comparator does: > > public int compare(Object o1, Object o2) > { > String s1 = Integer.parseInt((String)o1); > String s2 = ((Button)o2).getName(); > return s1.compareTo(s2); > }
Here is a quote from the definition of Comparable.compare: "The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y." Andrew.