java - 为什么二分查找返回-1

标签 java sorting binary-search

我正在开发一个小程序:

public static void main( String args[])
    {
        String[] places = {"Bangalore","Pune","San Francisco","New York City"};
        Arrays.sort(places, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o2.compareTo(o1);
        }
    });
        System.out.println(Arrays.binarySearch(places, "New York City"));
    }

这个程序正在打印 -1,但我的数组中有“纽约市”,那么为什么在这种情况下结果为负数?

最佳答案

通常,Arrays.binarySearch 假定数组中的项目已按其自然顺序排序。如果不按这种方式排序,二分搜索算法将不起作用。

您的比较器正在按照与自然顺序相反的顺序进行排序,因此算法无法找到纽约市。

但是有一个 overload of binarySearch that takes a Comparator ,以便算法可以假设它的排序方式与Comparator定义顺序相同。

The array must be sorted into ascending order according to the specified comparator (as by the sort(T[], Comparator) method) prior to making this call.

binarySearch 调用中重用您的Comparator

String[] places = {"Bangalore","Pune","San Francisco","New York City"};

Comparator<String> c = new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o2.compareTo(o1);
    }
};
Arrays.sort(places, c);
System.out.println(Arrays.binarySearch(places, "New York City", c));

然后您将得到 2 的正确输出。

关于java - 为什么二分查找返回-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52523430/

相关文章:

java - 在客户端(浏览器)的 Java EE Web 应用程序上播放音频

java - 如何使用 selenium (java) 在 iframe 中输入内容?

java - Android NDK/一般 JNI 问题 : Converting object/jobject to c++ user defiend type

java - 如果已排序,则使用二分搜索,否则使用线性搜索

algorithm - 在哪里选择线性搜索而不是二分搜索

java - 使用递归来测试两个字符串是否相同但方向相反

ruby-on-rails - 对结构体数组进行排序

java - Collections.sort 错误 : no suitable method found for sort

c# - Linq 在多层上对 IEnumerable 进行排序

java - 行数不相等的多个文件读取