使用 Stream API 交换和展平 Java Map<Integer, List<Integer>>



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然后是嵌套的List:

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));

相关内容

  • 没有找到相关文章

最新更新