java 如何反转Map

whitzsjs  于 2024-01-05  发布在  Java
关注(0)|答案(2)|浏览(197)

让我们来看看Map:

  • A -> {1,2,3}
  • B -> {3,4,5}
  • C -> {2,3,5}

我需要反转这张Map并获得:

  • 1 -> {A}
  • 2 -> {A,C}
  • 3 -> {A,B,C}
  • 4 -> {B}
  • 5 -> {B,C}

我用这段代码实现了这一点:

  1. public static <U, V> Map<V, Set<U>> reverseMap(Map<U, Set<V>> map) {
  2. Map<V, Set<U>> result = Maps.newHashMap();
  3. for(Map.Entry<U, Set<V>> entry : map.entrySet()) {
  4. for(V value : entry.getValue()) {
  5. Set<U> set = result.get(value);
  6. if(set == null) {
  7. set = Sets.newHashSet();
  8. result.put(value, set);
  9. }
  10. set.add(entry.getKey());
  11. result.put(value, set);
  12. }
  13. }
  14. return result;
  15. }

字符串
但这只是一个反向索引,所以我认为可能存在一个预定义的方法来做到这一点。
有人知道这样一个库吗?在Guava的方法?

6g8kf2rb

6g8kf2rb1#

如果您将HashMap<U, Set<V>>替换为HashMultimap<U, V>(它们是等价的,并且Multimap更易于使用),则现在可以使用Multimaps.invertFrom(),它将填充Multimap<V, U>
注意,正如Javadoc提到的,如果使用ImmutableMultimap,则可以直接调用ImmutableMultimap.inverse()

k2fxgqgv

k2fxgqgv2#

下面是一个使用流的解决方案:

  1. Map<V, Set<U>> invertedMap = map.entrySet().stream()
  2. .flatMap(e -> e.getValue().stream()
  3. .map(v -> Map.entry(e.getKey(), v)))
  4. .collect(Collectors.groupingBy(
  5. Map.Entry::getValue,
  6. Collectors.mapping(Map.Entry::getKey, Collectors.toSet())));

字符串

分步分解

1.将Map转换为条目流

  1. // Stream<Map.Entry<U, Set<V>>>
  2. map.entrySet().stream()

1.将每个条目拆分为值列表

  1. // Stream<Map.Entry<U, V>>
  2. .flatMap(e -> e.getValue().stream().map(v -> Map.entry(e.getKey(), v)))

中的每个项目的单独项目
1.将这些条目分组到一个新的Map中,其中键等于以前的值,值包含Map到该值的每个原始键的列表。

  1. // Map<V, Set<U>>
  2. .collect(Collectors.groupingBy(
  3. Map.Entry::getValue,
  4. Collectors.mapping(Map.Entry::getKey, Collectors.toSet())));
展开查看全部

相关问题