2

我已经编写了一个实现 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()(在这个队列中不受支持)。我究竟做错了什么?

4

1 回答 1

3

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

然而,还有一个更严重的设计问题。从根本上说,一个集合几乎不应该实现iterator()自己。您通常应该能够多次迭代集合 - 可能同时使用多个迭代器,它们都应该是独立的。迭代集合不应该改变它。

目前尚不完全清楚您要实现什么,但iterator()实现几乎总是应该创建一个具有某种可变状态的新对象,该对象引用原始集合但不会改变它。

于 2013-10-19T21:37:08.800 回答