2011-05-01 76 views
2

假設我正在遍歷java中的一個集合,在java中多次使用同一集合上的迭代器

Iterator<_someObject_> it = _someObject_.iterator(); 

好吧,首先我想通過集合中的每個對象並對每個訪問的對象進行更改。於是我就用:

while(it.hasNext()) { 
     _someObject_ = it.next(); 
     _someObject_.add3();  //made up method 
    } 

現在,我已經做到了這一點,我決定我想通過從開始整組迭代完成一次開展對他們的另一種方法,因爲我剛剛做通過我的第一次迭代更改每個元素。

我能再使用

while(it.hasNext()) 

我想也許迭代器有一個指針,所以一旦它達到第一次運行的最後一個元素,如果我再次調用while(it.hasNext()),指針仍然會在該集合的末尾,這意味着我的第二個while循環將會是無意義。

+1

你爲什麼不寫一個簡單的測試,你可以感覺到自己是否能正常工作的滿意度。 – Buhb 2011-05-01 14:18:40

回答

10

不,你不能這樣做。只需要問Iterable對象的另一個迭代器。

+2

當然,如果底層的'Set'實現沒有強制執行嚴格的順序,那麼你不能假定順序仍然是相同的。所以你會冒一個風險,假設兩個'Iterator'的調用會給你相同的內容訂單。 ;) – Gressie 2011-05-01 14:17:51

2

迭代器僅限一次性使用。

0

因爲我猜你已經發現Iterator沒有「重置」方法...所以你只是抓住另一個迭代器。簡單。

0

it.hasNext()循環後錯誤,這正是while循環結束的原因。如果你做了其他while(it.hasNext())之後it.hasNext()仍然是錯誤的,所以這個循環將立即退出。你需要一個新的循環迭代器。

4

對不起,但Iterator的合同規定您只能經過一次。因爲你無法確定下一個Iterator的順序,甚至不知道這個問題的內容(它可能會改變!),所以你最好在同一個塊中做所有的修改或方法調用。

0

確實迭代器只能單獨使用,但有一個名爲ListIterator的類,允許您通過回顧列表來完成此操作。一個例子是:

ArrayList<String> list = new ArrayList<String>(); 
list.add("hey!"); 
list.add("how"); 
list.add("are"); 
list.add("you?"); 
ListIterator it = list.listIterator(); 
while(it.hasNext()){ 
    System.out.println(it.next() +" ");//you print all the elements 
} 
//Now you go back. You can encapsulate this while sentence into a void reset method. 
while(it.hasPrevious()){ 
    it.previous(); 
} 
//Now you check that you've reached the beginning of the list 
while(it.hasNext()){ 
    System.out.println("back " + it.next() +" ");//you print all the elements 
} 

我認爲它可能對你有用,類。

+0

您可以隨時創建自己的Iterator並根據需要進行自定義。 – cabreracanal 2011-05-01 15:21:38