如何使用具有非唯一值的Guava进行地图反演?

我们怎样才能用番石榴做到这一点? 注意返回类型中存在List ,因为许多键可以映射到任何法线贴图中的相同值。

 public static  Map<V, List> inverse(Map map){ Map<V, List> result = new LinkedHashMap<V, List>(); for (Map.Entry entry : map.entrySet()) { if(!result.containsKey(entry.getValue())){ result.put(entry.getValue(), new ArrayList()); } result.get(entry.getValue()).add(entry.getKey()); } return result; } 

BiMap似乎坚持价值观的BiMap ,但我没有这种奢侈品。

你可以这样做:

 Map map = ...; ListMultimap inverse = Multimaps.invertFrom(Multimaps.forMap(map), ArrayListMultimap.create()); 

请注意,几乎任何时候你写Map>Map>或其他一些, ListMultimapSetMultimap就是你的真实所在想。

使用Multimap,选择一个使用列表的方法,如ArrayListMultimap ,这将允许使用dupes。

此外,您不必编写自己的反转方法, com.google.common.collect.Multimaps中提供了一种方法。

如果现在有人偶然发现(在Java的Stream时代),这里有两个基于Stream的单表达式解决方案:

1)基于ImmutableListMultimap + toImmutableListMultimap收集器的不可变版本

 ImmutableListMultimap output = inputMap.entrySet().stream() .collect(ImmutableListMultimap.toImmutableListMultimap(Map.Entry::getValue, Map.Entry::getKey)); 

2)基于ArrayListMultimap + Multimaps.toMultimap收集器的可变版本

 ListMultimap output = inputMap.entrySet().stream() .collect(Multimaps.toMultimap(Map.Entry::getValue, Map.Entry::getKey, ArrayListMultimap::create));