假设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.
}
}
我认为有更快的方法,因为假设列表已经排序。
答案 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());
}
}