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

Sug*_*lai 1 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
Run Code Online (Sandbox Code Playgroud)

这是我的自定义比较器

class MyNewComparator1 implements Comparator<String> {
    public int compare(String s1, String s2) {
        return s2.compareTo(s1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待的结果 0, -2, Unpredictable

但结果正在回归 -4, -4, -4

有人可以帮我理解为什么它会返回-4所有搜索?

谢谢

Erw*_*idt 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
    }
}
Run Code Online (Sandbox Code Playgroud)

还有另一种解决方案.您可以通过将自己的Comparator传递给方法调用作为最后一个参数来重新定义提升的 含义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
Run Code Online (Sandbox Code Playgroud)