Map<Integer,>;
Map<Integer, List<Integer>> forwardMap = Map.of(
100, List.of(6),
300, List.of(49, 52),
500, List.of(293)
);
我想‘平’键和值的列表和价值交换地图,结束了:
Map<Integer, Integer> reverseMap = Map.of(
6, 100,
49, 300
52, 300,
293, 500
);
我的无法编译尝试,其中我试图流式传输Set
Map<Integer, Integer> reverseMap = forwardMap.entrySet().stream().map(
entry -> entry.getValue().stream().collect(Collectors.toMap(Integer::getInteger, entry.getKey()));
);
也许我需要避免使用stream()两次-可能通过在某处以某种方式使用flatMap()。我也尝试过首先交换交换键和值-但最终仍然没有引用'外部'键和'内部'嵌套的整数在列表中,在同一时间。
我错过了什么或者完全误解了什么?
这是一个类似的答案,但添加了一些东西。
- 结果中的键是排序的,所以我按升序排序。
- 在您的示例中,最终结果中没有重复的键。如果发生这种情况,进程将抛出异常。有三种选择。
- 保留遇到的第一个副本及其相关值,这会导致数据丢失。
- 保留具有相同效果的最后副本。
- 返回重复键的列表值。
- 在这个练习中,我通过
(first, next)->first
合并函数选择了第一个选项。 - 我还返回
LinkedHashMap
中的项以保持排序顺序。
Map<Integer, Integer> result = forwardMap.entrySet().stream()
.flatMap(e -> e.getValue().stream()
.map(v -> Map.entry(v, e.getKey())))
.sorted(Entry.comparingByKey())
.collect(Collectors.toMap(Entry::getKey,
Entry::getValue, (first, next) -> first,
LinkedHashMap::new));
result.entrySet().forEach(System.out::println);
打印
6=100
49=300
52=300
293=500
如果你有一个重复的值,并想要保留它,它将如何工作。唯一的区别在于最终收集器。
groupingBy
用于为每个键创建列表- 指定
LinkedHashMap
以保持排序顺序。 - 和映射收集器用于从条目中提取所需的值。
Map<Integer, List<Integer>> forwardMap =
Map.of(100, List.of(6), 300, List.of(49, 52), 500,
List.of(293, 52));
Map<Integer, List<Integer>> result2 =
forwardMap.entrySet().stream()
.flatMap(e -> e.getValue().stream()
.map(v -> Map.entry(v, e.getKey())))
.sorted(Entry.comparingByKey())
.collect(Collectors.groupingBy(
Map.Entry::getKey, LinkedHashMap::new,
Collectors.mapping(
Map.Entry::getValue,
Collectors.toList())));
result2.entrySet().forEach(System.out::println);
打印
6=[100]
49=[300]
52=[500, 300]
293=[500]
作为您的目标的一部分是平坦的值,您是正确的,您可能需要一个flatMap
操作的地方。例如:
Map<Integer, Integer> reverseMap =
forwardMap.entrySet().stream()
.flatMap(
entry -> entry.getValue().stream().map(value -> Map.entry(value, entry.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));