2017-04-18 116 views
0

我有兩種方法遍歷包含鍵(字符串)和值(Arraylist)的哈希映射,並將所有Arraylist中的值添加到單個Arraylist中。使用HashMap迭代器

方法一沒有工作,所以我創建了方法二,它解決了問題,但我不知道爲什麼方法一不工作。有人可以解釋爲什麼方法二的作品和方法一不行?

方法1種

public ArrayList<Person> getPeopleList() 
{ 
    Iterator<ArrayList<Person>> iter = people.values().iterator(); 

    ArrayList<Person> allPersons = new ArrayList<>(); 
    while (iter.hasNext()) 
    { 
     for (int i = 0; i < iter.next().size(); i++) 
     { 
      allPersons.add(iter.next().get(i)); 
     } 

    } 
    return allPersons; 
} 

方法2

public ArrayList<Person> getPeopleList() 
{ 
    Iterator<ArrayList<Person>> iter = people.values().iterator(); 

    ArrayList<Person> allPersons = new ArrayList<>(); 

    ArrayList<Person> persons; 
    while (iter.hasNext()) 
    { 
     persons = iter.next(); 
     for (Person p : persons) 
     { 
      allPersons.add(p); 
     } 

    } 
    return allPersons; 
} 
+0

應該codereview.stackexchange.com –

+2

@AmitK貼不完全是,OP詢問有關問題,對於已經工作的代碼不是潛在的改進。 – Pshemo

+0

從來沒有聽說過它,爲什麼要張貼他們的? –

回答

5
for (int i = 0; i < iter.next().size(); i++) 

這在您的每次循環調用next()。您需要調用一次,並將結果存儲在一個變量中。請注意,List有一個addAll()方法,使得這個for循環無用。

有了流,你的整個代碼可以降低到

return map.values().stream().flatMap(List::stream).collect(Collectors.toList());