以下是我为了解Arrays.binarySearch
而构建的简单代码。但它正在返回一个我甚至没想到的结果。
String[] c = {"A", "Z", "B"};
Arrays.sort(c, new MyNewComparator1()); //Z, B, A
System.out.println(Arrays.binarySearch(c, "Z")); //0
System.out.println(Arrays.binarySearch(c, "S")); //-2 based on insertion point
System.out.println(Arrays.binarySearch(c, "N")); //Unpredicable result we can expect
这是我的自定义Comparator
class MyNewComparator1 implements Comparator<String> {
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
}
结果我期待0, -2, Unpredictable
但结果是它返回-4, -4, -4
有人可以帮我理解为什么它会为所有搜索返回-4
吗?
由于
答案 0 :(得分:7)
正如Javadoc所述,您的数组必须是:
数组必须按照升序排序 其元素的自然排序(通过
sort(Object [])
方法) 在打这个电话之前。
以上所述的sort(Object [])
方法澄清了:
将指定的对象数组排序为升序 它的元素的自然顺序。
您需要按升序排序排序,但要按降序顺序排序。
您需要更改比较器,使其按升序顺序排序:
class MyNewComparator1 implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.compareTo(s2); // <-- swap s1 and s2
}
}
还有另一种解决方案。您可以将自己的比较器作为最后一个参数传递给binarySearch
方法调用,从而重新定义升序 的含义。如果你这样做,那么不要更改比较器 - 保留原来发布的比较器。但是更改binarySearch
方法调用:
MyNewComparator1 comparator = new MyNewComparator1();
System.out.println(Arrays.binarySearch(c, "Z", comparator)); // 0
System.out.println(Arrays.binarySearch(c, "S", comparator)); // -2 based on insertion point
System.out.println(Arrays.binarySearch(c, "N", comparator)); // Unpredicable result we can expect