java - 迭代器实现导致无限循环

标签 java

我正在尝试为我构建的链表式类执行以下 foreach 循环:

boolean contains = false;
for(Thing t : front) {
    if(t.equals(something)) {
        t.doSomething();
        contains = true;
        break;
    } 
}

这是我实现的迭代器方法:

@Override
public Iterator<Thing> iterator() {
    Thing current = this;
    return new Iterator<Thing>() {
        public boolean hasNext() {
            return current.hasNext();
        }

        public Thing next() {
            return current.next;
        }
    };
}

我已经尝试对此进行调试,似乎它没有返回链接列表中的下一个元素,因此当我运行它并尝试执行 foreach 循环时会导致无限循环。

很抱歉,如果这个问题已经得到解答或者存在一个非常愚蠢的错误,我搜索了一段时间但找不到答案。这是我第一次编写迭代器,所以请温柔一点。 :)

最佳答案

您必须在 next() 中推进 Iterator 的状态:

    public Thing next() {
        current = current.next;
        return current;
    }

否则,对 next() 的所有调用都将返回相同的元素。

编辑:

您应该将局部变量声明 Thing current = this; 移动到匿名类实例中(即将其转换为实例变量)。

@Override
public Iterator<Thing> iterator() {
    return new Iterator<Thing>() {

        private Thing current = Thing.this;

        public boolean hasNext() {
            return current.hasNext();
        }

        public Thing next() {
            current = current.next;
            return current;
        }

    };
}

关于java - 迭代器实现导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33627656/

相关文章:

java - Oracle 11g Express Java JDBC;数据库工作区

java - 重新启动 Unix 服务

java - 如何像使用 avro console producer 一样生成 Kafka avro 记录?

java - 从广播接收器发送数据到android中的自定义线程不起作用?

c# - 使用多种语言编写应用程序

java - 什么是 TLAB(线程本地分配缓冲区)?

java - 如何用WebDriver处理Telerik弹出窗口(selenium JAVA)

java - 线程导致程序崩溃

java - SSL 检查绕过 - SSLSocketFactory

java - 如果所有对象都返回 false,如何触发某些内容