Java - 迭代包含List的Map

cmd*_*bob 4 java list map set

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

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

所以,首先我想获得Keys,它有效:

Set<String> keys = theMap.keySet();
Run Code Online (Sandbox Code Playgroud)

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

这就是我被困住的地方 - 网上的大部分信息似乎都假设我想要从Key返回的值是一个简单的String或Integer,而不是另一个Set,或者在这种情况下是List.我尝试theMap.values()但是没有用,我尝试了一个forloop/for:eachloop,而且这两个都没有.

谢谢你们!

Lou*_*man 17

for(List<String> valueList : map.values()) {
  for(String value : valueList) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

这真的是"正常"的做法.或者,如果你还需要钥匙......

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

也就是说,如果你有选择权,你可能会对Guava 感兴趣ListMultimap,它很像a Map<K, List<V>>,但有很多功能 - 包括一个Collection<V> values()与你所要求的完全一样的行为,"扁平化"所有的价值在multimap中成为一个集合.(披露:我向番石榴捐款.)


Jir*_*era 7

我建议迭代,Map.entrySet()因为它更快(您可以在一个步骤中找到键和值)。

Map<String, List<String>> m = Collections.singletonMap(
    "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 + " ");
  }
}
Run Code Online (Sandbox Code Playgroud)

或者同样使用 Java 8 API(Lambda 函数):

m.entrySet().forEach(me -> {
    System.out.println("Key: " + me.getKey());
    System.out.print("Values: ");
    me.getValue().forEach(s -> System.out.print(s + " "));
});
Run Code Online (Sandbox Code Playgroud)

或者使用一点 Java Stream API 映射核心和方法参考 :-)

m.entrySet().stream().map(me -> {
    return "Key: " + me.getKey() + "\n"
        + "Values: " + me.getValue().stream()
            .collect(Collectors.joining(" "));
    })
    .forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,输出是:

关键字:list1
值:s1 s2 s3