繁体   English   中英

Java 中的 Collections.binarySearch()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM