Java - 遍历包含列表的地图

新手上路,请多包涵

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

我有一个映射,其中包含一个字符串作为键,一个字符串列表作为值。我需要遍历地图中每个列表中包含的所有值。

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

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

这会返回一个包含我所有密钥的集合。伟大的 :)

这就是我陷入困境的地方——网络上的大多数信息似乎都假设我希望从键返回的值是一个简单的字符串或整数,而不是另一个集合,或者在这种情况下是一个列表。我尝试了 theMap.values() 但这没有用,我尝试了 forloop / for:eachloop,但都没有成功。

谢谢大家!

原文由 cmdrbob 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 387
2 个回答
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 的 ListMultimap 感兴趣,它很像 Map<K, List<V>> ,但具有更多功能 - 包括 Collection<V> values() 这与您要求的完全一样,将多图中的所有值“展平”到一个集合中。 (披露:我为番石榴做出了贡献。)

原文由 Louis Wasserman 发布,翻译遵循 CC BY-SA 4.0 许可协议

我建议迭代 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 + " ");
  }
}

或者同样使用 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 + " "));
});

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

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

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

键:list1
值:s1 s2 s3

原文由 Jiri Patera 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题