[英]java: why this binarySearch with comparator is not working?
更新:我正在尝试使用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?
您对列表进行了混洗,因此未对其进行排序。 您必须具有排序列表才能进行二进制搜索
要执行二进制搜索,必须对列表进行排序。 首先,您需要对列表进行混洗,这会使Collections.binarySearch
的先决条件无效。
在进行此调用之前,必须根据指定的比较器(如sort(List,Comparator)方法)将列表按升序排序。 如果未排序,则结果不确定。
该算法依赖于要排序的列表。 因此,当然,当您稍后对其进行排序时, binarySearch
起作用。
二进制搜索仅在列表已排序时才有效。 二进制搜索的工作方式是该算法假定,如果其“猜测”索引处的值大于我们所寻找的值,则实际索引必须较低-反之亦然。
如果不对集合进行排序,则该假设将不成立,因此算法将失败。
文档非常清楚地说明了这一点:
在进行此调用之前,必须根据指定的比较器(如
sort(List, Comparator)
方法)将列表按升序sort(List, Comparator)
。 如果未排序,则结果不确定。
二进制搜索取决于要搜索的列表的顺序。 您正在明确改组自己的。 您是要通过Comparator
对其进行排序吗?
当调用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);
对于此调用,文档说:
该列表必须根据指定的比较器以升序排序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.