我有一个对象列表,想要向前和向后迭代,直到找到“有效”的元素。
MyClass {
private boolean valid;
public boolean isValid() { return valid; }
}
List<MyClass> classes; //assume sorted list
现在我想从位置 idx
开始,向前和向后迭代以找到最接近的有效元素。到目前为止,我已经让前向算法发挥作用了。但我觉得代码还可以优化:
//应该从位置X开始
int idx = 10;
//find the closest element that is valid
for (ListIterator<MyClass> itr = classes.listIterator(idx); itr.hasNext();) {
if (itr.hasNext()) {
MyClass my = itr.next();
while (!my.isValid()) {
if (itr.hasNext()) {
my = itr.next();
} else {
break;
}
}
}
Sysout("the closest valid element is: " + my);
}
迭代器算法可以写得更好吗?
最佳答案
同时使用两个迭代器。从 idx
开始,并在循环的每次迭代中推进它们,直到达到极限:
ListIterator<MyClass> fwd = classes.listIterator(idx);
ListIterator<MyClass> bck = classes.listIterator(idx);
MyClass found = null;
while (fwd.hasNext() || bck.hasPrevious()) {
if (fwd.hasNext()) {
MyClass my = fwd.next();
if (my.isValid()) {
found = my;
break;
}
}
if (bck.hasPrevious()) {
MyClass my = bck.previous();
if (my.isValid()) {
found = my;
break;
}
}
}
如果在循环结束时found
为null
,则未找到有效项目。否则,found
包含最接近 idx
的项目。如果两个有效项目与idx
的距离相同,则返回位于前面的项目。
关于java - 如何双向迭代列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25543738/