2012-04-09 87 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