【问题标题】:Collections.binarySearch() in JavaJava 中的 Collections.binarySearch()
【发布时间】:2018-09-29 19:30:21
【问题描述】:

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

【问题讨论】:

    标签: java arrays list arraylist collections


    【解决方案1】:

    您必须按升序排序(根据 Collections.binarySearch 的文档),或者将自定义比较器作为第三个参数传递。

    int index = Collections.binarySearch(al, 50, Collections.reverseOrder());
    

    不这样做会导致undefined结果。

    【讨论】:

      【解决方案2】:

      除了需要对列表进行排序外,二分查找

      返回搜索键的索引,如果它包含在列表中;否则, (-(插入点) - 1)

      (Javadoc)

      即:负索引表示如果存在被搜索的项目将被放置的索引的负数,负 1。

      -1 表示它将被放置在索引 0 处

      -6 表示它将被放置在索引 5 处。

      【讨论】:

      • 插入点是没有意义的(在这种情况下),因为顺序是错误的。
      • @leonardkraemer 因此,我从“除了需要对列表进行排序”开始回答。
      【解决方案3】:

      是的,升序对这个算法很重要。只需将排序替换为Collections.sort(al)

      您将获得以下结果:

      [2, 10, 30, 50, 100]
      Found at index 3
      

      【讨论】:

        【解决方案4】:

        列表必须按自然升序排序,否则结果不可预测。

        来自Javadoc

        使用二进制在指定列表中搜索指定对象 搜索算法。 列表必须按升序排列 根据其元素的自然顺序(如由 sort(java.util.List) 方法)在进行此调用之前。如果不是 排序后,结果未定义。如果列表包含多个 元素等于指定的对象,不能保证哪个 会找到一个。


        现在,如果你真的想知道为什么结果是 -6,你必须知道这个方法在内部是如何工作的。它采用中间索引并检查它是否大于或小于您正在搜索的值。

        如果它更大(这里就是这种情况),它需要后半部分并执行相同的计算(低变为中,最大值保持最大值)。

        最后,如果未找到密钥,则该方法返回 -(low + 1),在您的情况下为 -(5 + 1),因为当无法进一步拆分时,最大索引会变低。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-11
          • 2011-08-05
          • 1970-01-01
          • 2021-11-19
          • 2013-12-25
          相关资源
          最近更新 更多