Java - 遍历包含列表的Map

8

这是我第一次在这里,希望我的翻译能够清晰明了!

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

所以,首先我想要获取键,这个步骤可以成功:

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

这让我得到了一个包含所有键的集合。太好了 :)

这就是我卡住的地方 - 网上大部分信息似乎假定从键返回的值是一个简单的字符串或整数,而不是另一个集合,或者在这种情况下是一个列表。我尝试使用 theMap.values(),但那行不通,我也尝试了for循环/for:each循环,但都没有成功。

谢谢各位!

4个回答

26
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()) {
    ...
  }
}

话说,如果你有这个选项,你可能会对GuavaListMultimap感兴趣,它很像一个Map<K,List<V>>,但具有更多特性,包括一个Collection<V> values(),该方法可以将multimap中所有值“展平”为一个集合,就像您所要求的一样。(披露:我为Guava做出了贡献。)


非常准确 :) 我已经尝试了很多变化 - 结果我弄错的是我如何使用第二个foreach循环返回的值。非常感谢! - cmdrbob

9
我建议使用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

0
你需要一个 Map<String, List<String>> 左边的 String 是键,右边的 List<String> 是值,在这种情况下是一组 StringList

0

使用Java 8 API(lambda函数)的另一个示例。
当您要进行迭代时:

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

theMap.forEach((key, value) -> {
       System.out.println("KEY: " + key);
       System.out.print("VALUES: ");
       value.forEach(System.out::println);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接