更新:我正在尝试使用Collections.sort()来使用比较器参数对arrayList进行排序。然后做二元搜索。
package collection;
import java.util.*;
public class TryBinarySearch {
public static void main(String[] args){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++)
list.add(i);
System.out.println(list);
int b = Collections.binarySearch(list, 8);
System.out.println(b); // a is 8 as expected.
Collections.shuffle(list);
System.out.println(list);
Collections.sort(list, new
Comparator<Integer>(){
public int compare(Integer a, Integer b){
return b.intValue() - a.intValue();
}
});
System.out.println(list); //list is reversed as expected.
int a = Collections.binarySearch(list, 8);
System.out.println(a); // why a is -1?
}
}
b是预期的8; 我做了一个反向排序。我的问题是为什么a是-1而不是92?
答案 0 :(得分:6)
你洗了清单,所以它没有排序。您必须有一个排序列表才能进行二进制搜索
答案 1 :(得分:3)
要执行二进制搜索,必须对列表进行排序。您首先对列表进行了洗牌,这使Collections.binarySearch
的先决条件无效。
在进行此调用之前,必须根据指定的比较器(通过sort(List,Comparator)方法)将列表按升序排序。如果未排序,则结果未定义。
该算法依赖于正在排序的列表。因此,当您稍后对其进行排序时,binarySearch
可以正常工作。
答案 2 :(得分:3)
二进制搜索仅在列表已排序时有效。二进制搜索的工作方式是该算法假定如果其值为&#34;猜测&#34; index高于我们要查找的索引,实际索引必须更低 - 反之亦然。
如果集合没有排序,那么该假设不会成立,因此算法失败。
documentation非常清楚地说明了这一点:
在进行此调用之前,必须根据指定的比较器(如
sort(List, Comparator)
方法)将列表按升序排序。如果未排序,则结果未定义。
答案 3 :(得分:0)
二进制搜索取决于您要搜索的列表。你明确地改变了你的。您的意思是通过Comparator
来排序吗?
答案 4 :(得分:0)
在致电binarySearch(list, key)
时,文档说:
列表必须按照自然顺序按升序排序
您的列表是使用自定义Comparator
排序的,因此您需要将其传递给调用以指示搜索算法如何比较项目:
Comparator<Integer> cmp = new Comparator<Integer>(){
public int compare(Integer a, Integer b){
return b.intValue() - a.intValue();
}
};
Collections.sort(list, cmp);
System.out.println(list); //list is reversed as expected.
int a = Collections.binarySearch(list, 8, cmp);
对于这个电话,文档说:
列表必须根据指定的比较器按升序排序