我编写了一个实现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()
(在此队列中不受支持)。我做错了什么?
答案 0 :(得分:3)
您的实现失败,因为当您(隐式)调用iterator()
时,您的itr
变量仍然只引用“空值”节点。您只能将其设置为next()
方法中的任何其他值,直到稍后才会调用。
然而,存在更严重的设计问题。从根本上说,一个集合几乎不应该实现iterator()
本身。您通常应该能够多次遍历集合 - 可能同时使用多个迭代器,这些迭代器都应该是独立的。迭代集合不应该改变它。
目前还不完全清楚你要实现的目标,但iterator()
实现应该几乎总是创建一个具有一些可变状态的 new 对象,引用到原始集合但不改变它。