Java - 迭代包含List的Map

时间:2012-04-09 15:50:16

标签: java list map set

第一次来这里,所以我希望这是有道理的!

我有一个Map,它包含一个字符串作为它的键,一个字符串列表作为它的值。我需要遍历Map中每个List中包含的所有值。

所以,首先我要获得有效的键:

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

这会返回一个包含我所有键的Set。太棒了:))

这就是我遇到的问题 - 网上的大部分信息似乎都假设我想要从Key返回的值是一个简单的String或Integer,而不是另一个Set,或者在这种情况下是名单。我尝试了theMap.values()但是没有用,我尝试了一个forloop / for:eachloop,而且这些都没有成功。

谢谢你们!

3 个答案:

答案 0 :(得分:17)

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's ListMultimap感兴趣,这很像Map<K, List<V>>,但有很多功能 - 包括Collection<V> values()的行为与您要求的完全相同,将多图中的所有值“展平”为一个集合。 (披露:我向Guava捐款。)

答案 1 :(得分:4)

我建议迭代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 

答案 2 :(得分:0)

您需要Map<String, List<String>>

左侧是String,右侧List<String>是值,在这种情况下是List String s