Java - 数组binarySearch在自定义排序后返回意外结果

时间:2017-07-09 03:18:24

标签: java arrays binary-search

以下是我为了解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吗?

由于

1 个答案:

答案 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