Java中的Collections.binarySearch()

时间:2018-04-19 10:20:37

标签: java arrays list arraylist collections

我正在使用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

处找到

4 个答案:

答案 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