【问题标题】:Java 8 convert Map<Integer, List<String>> to Map<String, List<Integer>> with [duplicate]Java 8 使用 [重复] 将 Map<Integer, List<String>> 转换为 Map<String, List<Integer>>
【发布时间】:2023-03-26 20:11:01
【问题描述】:

我有一个 Map 是一个值列表的映射,但我需要反转它以便

Map<Integer, List<String>> 

变成

Map<String, List<Integer>>

例如我有

1 -> { A, B, C }
2 -> { B }
3 -> { A, C }

我想看看

A -> { 1, 3 }
B -> { 1, 2 }
C -> { 1, 3 }

在 Java 8 中有没有比遍历映射条目并创建一个集合条目(如果它不存在)并添加到列表等更简单的方法?我一直认为这很明显,但我无法解决。

提前致谢

【问题讨论】:

  • 可能是一个重复,当然,但它为列出的问题提供了一个很好的 Java 8 更新。也许我们尊敬的 Wasserman 先生会愿意为链接的副本提供他的答案?
  • @ErickG.Hagstrom 我已经对这个问题有了答案;)我想我可以编辑它以添加另一个
  • 感谢您提供指向副本的指针 - 主要是我决定让它与 Java 8 一起使用,并且下面的答案符合要求。
  • @LouisWasserman 我认为这将是一个很好的编辑。您现有的答案当时非常好并且仍然有效,但是为 Java 8 更新将值得 IMO 付出努力。 (特别是因为这不是我的努力;)

标签: java lambda java-8


【解决方案1】:

未经测试,但您可以这样做:

mapIntToStrings.entrySet().stream()
   .flatMap(entryIntToStrings -> entryIntToStrings.getValue().stream()
       .map(str -> new AbstractMap.SimpleEntry<>(entryIntToStrings.getKey(), str)))
   .collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList())))

【讨论】:

  • 什么是entryIntToStrings
  • @Andreas 哎呀,修复了,这是 lambda 的参数。
  • 这将是链接 dup 问题的一个很好的答案。只是在说'。 :-)
  • 谢谢。我错过了 AbstractMap.SimpleEntry。如此之近,却又如此之远...... :)
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2017-07-18
  • 2017-01-28
  • 2020-03-17
  • 2019-12-06
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多