2012-04-09 85 views
4

第一次在這裏,所以我希望這是有道理的!Java - 迭代包含列表的地圖

我有一個包含一個字符串,因爲它的關鍵和一個字符串的列表,因爲它的價值的地圖。我需要遍歷Map中每個List中包含的所有vlaue。

所以,首先我要拿到鑰匙,它的工作原理:

Set<String> keys = theMap.keySet(); 

這將返回我包含我的所有密鑰的設置。偉大的:)

這是我卡住的地方 - 網上的大部分信息似乎都假設我想要從鍵返回的值將是一個簡單的字符串或整數,而不是另一個Set,或者在這種情況下是列表。我嘗試了theMap.values(),但那並沒有奏效,我嘗試了forloop/for:eachloop,而這兩個都沒有成功。

謝謝你們啦!

回答

15
for(List<String> valueList : map.values()) { 
    for(String value : valueList) { 
    ... 
    } 
} 

這確實是「正常」的做法。或者,如果你需要的關鍵,以及...

for(Map.Entry<String, List<String>> entry : map.entrySet()) { 
    String key = entry.getKey(); 
    for (String value : entry.getValue()) { 
    ... 
    } 
} 

也就是說,如果你有選擇,你可能會感興趣的Guava'sListMultimap,這是很多像Map<K, List<V>>,但有很多更多的功能 - 包括一個Collection<V> values(),其行爲與您要求的完全相同,將multimap中的所有值「拼合」成一個集合。 (披露:我貢獻番石榴)

+0

上:)我已經走了這如此多的變化點 - 原來我如何使用我已經得到了錯誤的東西由第二個foreach循環返回的值。非常感謝! – cmdrbob 2012-04-09 16:08:00

0

你需要一個Map<String, List<String>>

左手邊String是關鍵,右側List<String>是價值,在這種情況下是String小號

List
3

我推薦迭代Map.entrySet(),因爲它更快(在一個步驟中同時具有鍵和值)。

Map<String, List<String>> m = new HashMap<String, List<String>>(); 

m.put("list1", Arrays.asList("s1", "s2", "s3")); 

for (Map.Entry<String, List<String>> me : m.entrySet()) { 
    String key = me.getKey(); 
    List<String> valueList = me.getValue(); 
    System.out.println("Key: " + key); 
    System.out.print("Values: "); 
    for (String s : valueList) { 
    System.out.print(s + " "); 
    } 
} 

,並如預期的輸出:

 
Key: list1 
Values: s1 s2 s3