Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么二进制搜索返回-1_Java_Sorting_Binary Search - Fatal编程技术网

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

Java 为什么二进制搜索返回-1,java,sorting,binary-search,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

我正在做一个小程序:

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"));
    }
publicstaticvoidmain(字符串参数[])
{
String[]places={“班加罗尔”、“浦那”、“旧金山”、“纽约市”};
sort(places,newcomparator(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o2.compareTo(o1);
}
});
System.out.println(Arrays.binarySearch(地点,“纽约市”);
}

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

比较器按逆字母顺序排序。二进制搜索需要以升序形式对数组进行排序

你的比较器的顺序是错误的。尝试:

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"));
String[]places={“班加罗尔”、“浦那”、“旧金山”、“纽约市”};
sort(places,newcomparator(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o1。与(o2)相比;
}
});
System.out.println(Arrays.binarySearch(地点,“纽约市”);

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

在您的示例中,城市没有任何特定的顺序,因此搜索将不起作用


您的比较器按逆字母顺序排序,因此数组也必须按逆字母顺序排序。

数组。binarySearch需要按升序排序数组,但在您的情况下,将其设置为降序。。如果使用以下命令更改比较函数,它将按升序排序

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

因此,如果您按升序排序,它将正常工作,
数组。binarySearch
假定数组中的项已按其自然顺序排序。如果不按这种方式排序,二进制搜索算法就不起作用

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

但是有一个,因此算法可以假设它的排序方式与
比较器定义顺序的方式相同

在进行此调用之前,必须根据指定的比较器将数组按升序排序(如通过
sort(T[],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));
String[]places={“班加罗尔”、“浦那”、“旧金山”、“纽约市”};
比较器c=新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o2.compareTo(o1);
}
};
数组。排序(位置,c);
System.out.println(Arrays.binarySearch(places,“newyorkcity”,c));

然后您将获得
2

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

String[] places = {"Bangalore","Pune","San Francisco","New York City"};
但排序后,它变成:

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

因此,当您使用二进制搜索时,它首先查看“Pune”,然后查看“San Francisco”,因为二进制搜索的本质是只查看“树”的一半。正如其他人所说,尝试更改比较器的顺序,或者尝试其他搜索算法

您按相反(降序)顺序对位置进行了排序。必须使用用于排序的相同比较器。排序顺序决定二进制搜索输出?您按降序对数组进行排序,并且
数组。binarySerch
默认使用递增比较器。因此,这是错误的。数组没有保留您用于排序的最后一个比较器,因此binarySearch无法知道您除了增加自然顺序之外的其他意图。是否只是我颠倒了排序顺序,使binarySearch始终返回-1?