我正在开发一个小程序:
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”,为什么在这种情况下结果为负?
答案 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”。就像其他人说的那样,请尝试更改比较器的顺序,或尝试其他搜索算法。