繁体   English   中英

在增强的for循环中使用类

[英]Using a class within an enhanced for-loop

我编写了一个实现Collection和Iterable的类,现在尝试通过增强的for循环运行它。 您可以在这里找到它: LinkedQueue

该类的重点是可以使用LinkedQueue.getNext()遍历集合,该方法工作正常。 但是,我也希望能够使用for循环对值进行迭代。 当前代码:

LinkedQueue<String> queue = new LinkedQueue();
queue.add("Test one");
queue.add("Test two");
queue.add("Test three");
System.out.println("queue.size = " + queue.size());
System.out.println("contents:");
for (String s : queue) {
    System.out.print("Test: ");
    System.out.println(s);
}
System.out.println("contents (x9):");
for (int i = 0; i < 9; i++) {
    System.out.println(queue.getNext());
}

打印输出:

queue.size = 3
contents:
contents (x9):
Test one
Test two
Test three
...etc...

因此,似乎for循环无法正确打印。 我认为这不是大小问题,因为队列在开始之前的大小为3。 所以现在我的问题很可能是“可迭代方法出了什么问题”,分别是hasNext()next()remove() (此队列中不支持)。 我究竟做错了什么?

您的实现失败,因为(隐式)调用iterator() ,您的itr变量仍仅引用“空值”节点。 您只能在next()方法中将其设置为任何其他值,直到稍后才调用。

但是,存在更严重的设计问题。 从根本上讲,集合几乎永远都不要实现iterator()本身。 通常,您应该能够多次遍历一个集合-可能同时使用多个迭代器,而这些迭代器应该都是独立的。 遍历集合不应更改它。

目前尚不清楚您要实现的目标,但是iterator()实现几乎应该始终创建一个具有某种可变状态的对象,该状态引用原始集合,但不会对其进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM