java - 如何双向迭代列表?

标签 java iterator

我有一个对象列表,想要向前和向后迭代,直到找到“有效”的元素。

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;
        }
    }
}

如果在循环结束时foundnull,则未找到有效项目。否则,found 包含最接近 idx 的项目。如果两个有效项目与idx的距离相同,则返回位于前面的项目。

关于java - 如何双向迭代列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25543738/

相关文章:

java - ConcurrentSkipListSet 如何具有弱一致的迭代器?了解 'weakly consistent'的含义

c++ - STL 不提供通过索引返回迭代器的函数有什么原因吗?

java - 将位置数据插入现有 sql 数据库的 Android 应用程序

java - Ajax 在用户名可用性方面无法与 JSP 配合使用

java - 无法使用 HTTPUNIT 获取网页上的链接数量?

JavaScript 检查迭代器是否包含值

php - 当作为集合的一部分对其进行迭代时,对象的方法是否可以被拦截?

c++ - 遍历 vector 并删除其某些元素的安全方法是什么

java - Android中如何获取日期分隔符?

java - Hibernate不保存时间戳字段