簡體   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