2017-04-12 60 views
-2

我試圖用iterator在迭代列表中,由於某種原因它在無限期。Java迭代器在無限循環中進入

這裏是代碼

{ 
List<Person> Person1 = new ArrayList<Person>(); 

    Person p1 = new Person("Name1", "Virginia"); 

    Person1.add(new Person("Nae2", "Virginia")); 

    printerlist(Person1); 

    printerlist(p1); 

} 

private static void printerlist(List<Person> p) { 

    /* 
    * print the list 
    */ 
    while (p.iterator().hasNext()) { 
     System.out.println(p.iterator().next().getCity()); 
    } 

} 
+2

首先,你的代碼不能編譯,你怎麼能把單個'Person'對象傳遞給'printerlist(List)'方法,提供最小代碼來複制 – developer

+0

它編譯的問題: –

+1

@YuvaRaj第二個調用'printerlist'不會編譯。 –

回答

4

想想這行做:

while (p.iterator().hasNext()) { 

要評估的條件每一次,你得到迭代器對象,這從未被觸及過。

由於您從未使用任何新迭代器,因此hasNext()將始終爲真。

同樣,在下一行:

System.out.println(p.iterator().next().getCity()); 

你得到另一個新的迭代,因此要求它next()總是會返回列表中的第一項。


爲了正確循環,您需要在整個循環中重複使用相同的迭代器。您可以通過顯式地創建和使用一個單一的迭代器,像這樣做這一點:

Iterator<Person> itr = p.iterator(); 
    while (itr.hasNext()) { 
     System.out.println(itr.next().getCity()); 
    } 

,或者您可以使用類似的enhanced for-loop,讓Java的隱式地創建和管理迭代器:

while (Person person : p) { 
     System.out.println(person.getCity()); 
    } 

這是功能上等同於

for (Iterator<Person> itr = p.iterator(); itr.hasNext();) { 
     Person person = itr.next(); 
     System.out.println(person.getCity()); 
    } 
+0

非常感謝! –

+1

然後在下一行中,您正在執行'p.iterator()。next()...',它也一次又一次地獲取集合中的第一個項目。 – Gray

+1

@Gray好點,我已經擴展了我的答案,並提供了正確的實現。 – azurefrog

4

p.iterator()創建列表p一個新的迭代。所以遊標始終在收集開始。

試試這個:

Iterator<Person> it = p.iterator(); 
while (it.hasNext()) { 
    System.out.println(it.next().getCity()); 
} 
3

每次通話時間p.iterator()你會得到從第一個元素的新迭代器。相反,您應該將返回的Iterator分配給一個臨時變量。

0

您不需要使用iterator()這將返回迭代類型的對象(Iterator<T>)。它用於返回傳遞給它的類型的接口(Java Collections的一部分)。迭代器用於遍歷元素列表,並在必要時刪除元素。

我們可以從p中獲得iteration()的捕獲器,並使用通用的<Person>將其分配到Iterator

您需要創建Iterator<>爲Person對象類型,然後只需要使用while(p.hasNext()) {

如果您使用的是Java 1。5或更高版本,您可以使用for each(enhanced for)循環來迭代對象(列表)類型。之前1.5 迭代器用於遍歷列表。通知迭代器仍在使用。

如果您想了解更多關於iterator()的信息,請參閱java docthisstackoverflow question