我正在使用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
处找到答案 0 :(得分:7)
列表必须按自然顺序排序,否则结果无法预测。
来自Javadoc
使用二进制文件在指定列表中搜索指定的对象 搜索算法。 列表必须按升序排序 根据其元素的自然顺序(如 sort(java.util.List)方法)在进行此调用之前。如果不是 排序,结果未定义。如果列表包含多个 元素等于指定的对象,不保证哪个 一个人会被找到。
现在,如果您真的想知道结果为-6的原因,您必须知道该方法如何在内部工作。它需要中间索引并检查它是否大于或小于您正在搜索的值。
如果它更大(这里是这种情况),它需要后半部分并进行相同的计算(低变为中间,最大值保持最大)。
最后,如果找不到密钥,该方法将返回-(low + 1)
,在您的情况下为-(5 + 1)
,因为当无法进一步拆分时,最大索引会变为低。< / p>
答案 1 :(得分:3)
除了需要对列表进行排序外,二进制搜索
返回搜索键的索引(如果它包含在列表中);否则,( - (插入点) - 1)
(Javadoc)
即:否定索引指定索引的负数,如果该项目存在,将放置该项目的负数减去1.
即
-1表示它将被放置在索引0
-6表示它将被放置在索引5处。
答案 2 :(得分:2)
您必须按升序排序(根据Collections.binarySearch的文档),或者将自定义比较器作为第三个参数传递。
int index = Collections.binarySearch(al, 50, Collections.reverseOrder());
如果不这样做,将导致undefined结果。
答案 3 :(得分:0)
是的,升序对此算法很重要。只需将排序替换为Collections.sort(al)
。
结果你将得到:
[2, 10, 30, 50, 100]
Found at index 3