从排序列表中获取间隔的最快方法?

时间:2014-01-04 17:44:31

标签: java algorithm search arraylist

假设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.
   }
}

我认为有更快的方法,因为假设列表已经排序。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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);

答案 2 :(得分: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());
    }
}