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?