[英]Collections.binarySearch() in Java
我正在使用 binarySearch() 方法来查找列表中元素的位置。 我不明白为什么索引是-6。 我看到元素在按降序排序后位于位置 1。 有人能告诉我为什么我看到位置-6吗? 谢谢!
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test
{
public static void main(String[] args)
{
List<Integer> al = new ArrayList<>();
al.add(100);
al.add(30);
al.add(10);
al.add(2);
al.add(50);
Collections.sort(al, Collections.reverseOrder());
System.out.println(al);
int index = Collections.binarySearch(al, 50);
System.out.println("Found at index " + index);
}
}
输出为:[100, 50, 30, 10, 2]
在索引 -6 处找到
列表必须按自然升序排序,否则结果不可预测。
来自Javadoc
使用二进制搜索算法搜索指定对象的指定列表。 在进行此调用之前,必须根据其元素的自然顺序(如 sort(java.util.List) 方法)将列表按升序排序。 如果未排序,则结果是 undefined 。 如果列表包含多个与指定对象相等的元素,则无法保证会找到哪一个。
现在,如果你真的想知道为什么结果是 -6,你必须知道这个方法在内部是如何工作的。 它采用中间索引并检查它是大于还是小于您要搜索的值。
如果它更大(这里就是这种情况),它会占用下半部分并进行相同的计算(低变为中,最大值保持最大值)。
最后,如果未找到键,该方法返回-(low + 1)
,在您的情况下为-(5 + 1)
因为当无法进一步拆分时,最大索引变为低。
您必须按升序排序(根据 Collections.binarySearch 的文档),或者将自定义比较器作为第三个参数传递。
int index = Collections.binarySearch(al, 50, Collections.reverseOrder());
不这样做将导致未定义的结果。
除了需要对列表进行排序之外,二分查找
返回搜索键的索引,如果它包含在列表中; 否则, (-(插入点) - 1)
(Javadoc)
即:负索引指定索引的负数,如果它存在,则将在该索引处放置正在搜索的项目,减 1。
即
-1 表示它将被放置在索引 0
-6 表示它将被放置在索引 5 处。
是的,升序对这个算法很重要。 只需用Collections.sort(al)
替换排序即可。
结果,您将拥有:
[2, 10, 30, 50, 100]
Found at index 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.