2014-09-23 110 views
0
Set set = hm.entrySet(); 
Iterator i = set.iterator(); 

while (i.hasNext()) { 
    Map.Entry me = (Map.Entry)i.next(); 

    // me.getValue should point to an arraylist 
    Iterator<Student> it = (me.getValue()).iterator(); 

    while (it.hasNext()) { 
     // some code 
    } 
} 

好吧,我試着迭代Arraylist,由於某種原因它不起作用,編譯器告訴我它找不到符號。我知道me.getValue()應指向一個對象,在這種情況下,鍵/值對的值部分是Arraylist。那麼,怎麼了?在ArrayList的hashmap上迭代

+1

郵政堆棧跟蹤請 – shinjw 2014-09-23 01:53:19

+0

您的意思是生成輸出? – Redowl 2014-09-23 01:58:30

+0

[什麼是堆棧跟蹤](http://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can-i-use-it-to-debug-my-application-errors ),但它是在運行時生成的,而您的問題似乎是編譯時間之一。 – Pshemo 2014-09-23 01:59:15

回答

3

當你

Map.Entry me = (Map.Entry)i.next(); 

你創建了Map.Entry的類型化的情況下,這是喜歡做

Map.Entry<Object, Object> me = ... 

然後,當你嘗試做

Iterator<Student> it = (me.getValue()).iterator(); 

這相當於試圖做

ArrayList<Object> objects; 
Strudent s = objects.get(0); 

其中,顯然,你不能這樣做。相反,你需要使用合適的類型來實例Map.Entry的對象:

Map.Entry<YourKeyType, ArrayList<Student>> me = 
     (Map.Entry<YourKeyType, ArrayList<Student>>) i.next(); 

注意,就可以避免投那裏,走generic type safety充分利用,通過使您迭代器Iterator<YourKeyType, ArrayList<Student>>而不是聲明爲原始類型。

+0

這是我可以通過閱讀文檔找到的東西嗎? – Redowl 2014-09-23 02:03:09

+0

是的,但泛型是一個相當大的概念來包裝你的頭,我建議你先看看我鏈接到的教程。 – drewmoore 2014-09-23 02:14:40

+0

也許值得一提的是,這是一種「舊式」的迭代方式,它不再像以前那樣每次迭代更新(或者甚至是更新的Java中的Iterable.forEach) [更多信息](http://stackoverflow.com/questions/16635398/java-8-iterable-foreach-vs-f)。 – khampson 2014-09-23 02:35:38