为什么二进制搜索返回-1

时间:2018-09-26 17:44:24

标签: 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,但是我的数组中有“ New York City”,为什么在这种情况下结果为负?

5 个答案:

答案 0 :(得分:4)

通常,Arrays.binarySearch假定数组中的项目已经按照其自然顺序进行了排序。如果未按这种方式进行排序,二进制搜索算法将无法正常工作。

您的Comparator对自然顺序进行了排序,因此该算法找不到纽约。

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

  

必须根据指定的比较器将数组按升序排序(如在进行此调用之前由sort(T[], Comparator) method)进行排序。

在您的Comparator通话中重复使用binarySearch

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的正确输出。

答案 1 :(得分:1)

使用二进制搜索时,要搜索的数据对象的数组必须按照用于搜索的比较器的顺序排列。

在您的示例中,城市的排列顺序不是特定的,因此搜索将无法进行。

您的比较器以反向字母顺序排序,因此数组也必须以反向字母顺序排序。

答案 2 :(得分:0)

比较器以相反的字母顺序排序。二进制搜索需要以升序对数组进行排序。

您的比较器顺序错误。试试:

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

答案 3 :(得分:0)

Arrays.binarySearch 需要按升序的顺序对数组进行排序,但是对于您而言,您是将其降序。如果您更改了与下面的功能进行比较,它将按升序顺序

排序
public int compare(String o1, String o2) {
     return o1.compareTo(o2);
}

因此,如果您以升序的顺序对其进行排序,它将可以正常工作

答案 4 :(得分:0)

如果使用的是IDE,请在Arrays.binarySearch方法中放置一个断点。您的数组以

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

但排序后变为:

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

因此,当您使用二进制搜索时,由于二进制搜索的性质仅通过“树”的一半进行查找,因此它首先显示“ Pune”,然后显示“ San Francisco”。就像其他人说的那样,请尝试更改比较器的顺序,或尝试其他搜索算法。