第一次在这里,所以我希望这是有道理的!
我有一个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中成为一个集合.(披露:我向番石榴捐款.)
我建议迭代,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