2012-09-07 47 views
33

我有以下LinkedHashMap聲明。如何通過LinkedHashMap迭代列表作爲值

LinkedHashMap<String, ArrayList<String>> test1 

我的觀點是我該如何迭代這個哈希映射。 我想這樣做,爲每個鍵獲取相應的數組列表,並打印數組的列表的值與數組逐個打印。

我試過,但得到只返回字符串,

String key = iterator.next().toString(); 
ArrayList<String> value = (ArrayList<String>)test1.get(key) 

回答

104
for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) { 
    String key = entry.getKey(); 
    ArrayList<String> value = entry.getValue(); 
    // now work with key and value... 
} 

順便說一句,你真的應該聲明變量作爲接口類型,而不是如Map<String, List<String>>

+2

順便說一句,我想有一個與插入順序列表,我用的HashMap之前,但它搞砸的順序。 –

+4

我不是說不要使用'LinkedHashMap',但通常的最佳做法是聲明'Map > map = new LinkedHashMap >'。 –

+1

@Pbasak您只能使用接口類型進行聲明。當你實例化地圖對象時,你仍然會使用你的'LinkedHashMap',它將確保插入順序保持不變。這樣你就可以堅持你的實現選擇,但仍然使用更通用的類型到外部。 –

5

您可以使用條目集並遍歷條目,這些條目允許您直接訪問鍵和值。

for (Entry<String, ArrayList<String>> entry : test1.entrySet() { 
    System.out.println(entry.getKey() + "/" + entry.getValue()); 
} 

我試過,但只能得到返回的字符串

你爲什麼這麼認爲?方法get返回類型E,其中選擇了泛型類型參數,在您的案例ArrayList<String>中。

7
// iterate over the map 
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){ 
    // iterate over each entry 
    for(String item : entry.getValue()){ 
     // print the map's key with each value in the ArrayList 
     System.out.println(entry.getKey() + ": " + item); 
    } 
} 
+2

看到答案從來沒有想到這一點,我在C#中使用foreach,這是類似的。 –

11

我假設你在你的get語句中有一個輸入錯誤,它應該是test1.get(key)。如果是這樣,我不知道它爲什麼不返回一個ArrayList,除非你沒有在地圖中放入正確的類型。

這應該工作:

// populate the map 
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.put("key1", new ArrayList<String>()); 
test1.put("key2", new ArrayList<String>()); 

// loop over the set using an entry set 
for(Map.Entry<String,List<String>> entry : test1.entrySet()){ 
    String key = entry.getKey(); 
    List<String>value = entry.getValue(); 
    // ... 
} 

,或者您可以使用

// second alternative - loop over the keys and get the value per key 
for(String key : test1.keySet()){ 
    List<String>value = test1.get(key); 
    // ... 
} 

宣告你的增值經銷商時,應使用接口名稱(並在通用PARAMS),除非你有一個非常特殊的理由爲什麼你要使用實現來定義。

+0

您好我使用linkhashmap保持插入順序的元素。 –

+0

當然 - 但您可以在創建實例時指定LinkedHashMap。但是,使用變量的接口名稱可以使代碼實現獨立。即:您可以輕鬆地在稍後的時間將其替換爲其他內容,而無需重新編碼所有內容。請參閱上面的示例中關於使用接口作爲var的聲明和實現的LinkedHashMap。 –

2

在Java 8:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.forEach((key,value) -> { 
    System.out.println(key + " -> " + value); 
});