我有一种通过键Map<String, List<Integer>>
对值进行分组的映射,我想还原以将每个值映射到相应的键
示例:我要转换下面的代码
Map<String, List<Integer>> mapOfIntList = new HashMap<String, List<Integer>>();
mapOfIntList.put("UNIT", Arrays.asList(1, 2, 3, 8, 7, 0, 8, 6));
mapOfIntList.put("TEN", Arrays.asList(24, 90, 63, 87));
mapOfIntList.put("HUNDRED", Arrays.asList(645, 457, 306, 762));
mapOfIntList.put("THOUSAND", Arrays.asList(1234, 3456, 5340, 9876));
到另一个我可以找到的Map(Integer,String): (1,“ UNIT”),(2,“ UNIT”)...(24,“ TEN”),(90,“ TEN”)...(645,“ HUNDRED”)...(3456,“一千”)...
答案 0 :(得分:9)
您可以使用
Map<Integer, String> mapNumberToType = mapOfIntList.entrySet().stream()
.collect(HashMap::new, (m,e)->e.getValue().forEach(v->m.put(v,e.getKey())), Map::putAll);
您可能会认识到传递给forEach
(累加器)函数的第二个函数与this answer的基于collect
的代码的相似性。对于顺序执行,它们基本相同,但是此Stream解决方案支持并行处理。因此,它需要其他两个功能来支持创建本地容器并将其合并。
另请参阅文档的Mutable reduction部分。
答案 1 :(得分:6)
或使用两个嵌套的forEach
mapOfIntList.forEach((key, value) ->
value.forEach(v -> {
mapNumberToType.put(v, key);
})
);
@nullpointer在单线评论中
mapOfIntList.forEach((key, value) -> value.forEach(v -> mapNumberToType.put(v, key)));
答案 2 :(得分:4)
我找到了解决方法:
Map<Integer, String> mapNumberToType = mapOfIntList
.entrySet()
.stream()
.flatMap(
entry -> entry.getValue().stream()
.map(number -> Pair.of(number, entry.getKey()))
.collect(Collectors.toList()).stream())
.collect(
Collectors.toMap(Pair::getLeft,
Pair::getRight, (a, b) -> {
return a;
}));
System.out.println("Number/Type correspondance : " + mapNumberToType);
希望这可以帮助遇到相同问题的任何人!
答案 3 :(得分:2)
这会更简单:
source.entrySet()
.stream()
.flatMap(e -> e.getValue().stream().map(s -> new AbstractMap.SimpleEntry<>(s, e.getKey())))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> l));