如何使用具有非唯一值的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
或其他一些, ListMultimap
或SetMultimap
就是你的真实所在想。
使用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));