【问题标题】:Fastest way to get interval from sorted list?从排序列表中获取间隔的最快方法?
【发布时间】:2014-01-22 08:22:20
【问题描述】:

假设有 Element 类和 position 属性。

public class Element {

   private float position;

   public float getPosition() {
      return position;
   }

   public void setPosition(float position) {
      this.position = position;
   }
}

此外,ArrayList<Element> elements 包含随机分配的 position 值的元素。然后元素按位置值升序排序。

问题:在某个位置间隔<a,b> 内获取所有元素的最快方法是什么,而不是简单地遍历元素,如下所示:

for (Element element : elements) {
   if (element.getPosition() > a && element.getPosition() < b) {
      // Do something with an element.
   }
}

由于列表已排序的假设,我假设有一种更快的方法。

【问题讨论】:

    标签: java algorithm search arraylist


    【解决方案1】:

    使用binary search 查找范围的开始和结束,然后在它们之间进行迭代。

    【讨论】:

    • 可能还值得注意的是有一个Arrays.binarySearch 方法。
    • @BoristheSpider 的问题是关于List 所以Collections.binarySearch 可能会更尖锐:)
    • 但是如果没有对应区间边界的元素,如何进行二分查找呢?即如果 Collections.binarySearch(elements, a) 或 Collections.binarySearch(elements, b) 返回 null
    • @krsi:它不返回null。它返回(修改后的)插入索引。查看文档。
    【解决方案2】:

    您可以使用两个二进制搜索更快地完成:

    final int start = Collections.binarySearch(elements, a);
    final int end = Collections.binarySearch(elements, b);
    return elements.subList(start, end + 1);
    

    确保您的Element 正确实现Comparable 接口:

    public class Element implements Comparable {
        @Override
        public int compare(Element e1, Element e2) {
            return Float.compare(e1.getPosition(), e2.getPosition());
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果所有元素都是唯一的(或者您不需要存储重复元素),则可以使用实现 NavigableSet 接口的 TreeSet:

      TreeSet<Element> set = new TreeSet<>(new Comparator<Element> () {
          public int compare(Element e1, Element e2) {
              return Float.compare(e1.getPosition(), e2.getPosition());
          }
      });
      
      Set<Element> betweenAandB = set.subSet(a, false, b, false);
      

      【讨论】:

      • 此方法将from inclusive 返回到to exclusive - 似乎 OP 希望两者都独占,因此需要使用 other method
      • @BoristheSpider 确实 - 已修改。
      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多