如何使用具有非唯一值的 Guava 进行地图反演?
我们如何用番石榴做到这一点?请注意返回类型中存在 List
,因为许多键可以映射到任何法线映射中的相同值。
public static <K, V> Map<V, List<K>> inverse(Map<K, V> map){
Map<V, List<K>> result = new LinkedHashMap<V, List<K>>();
for (Map.Entry<K, V> entry : map.entrySet()) {
if(!result.containsKey(entry.getValue())){
result.put(entry.getValue(), new ArrayList<K>());
}
result.get(entry.getValue()).add(entry.getKey());
}
return result;
}
BiMap 似乎坚持值的唯一性,但我没有这种奢侈。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以这样做:
请注意,几乎任何时候您编写
Map>
或Map>
或其中一些,ListMultimap
或SetMultimap
才是您真正想要的。You can do this:
Do note that pretty much any time you write
Map<K, List<V>>
orMap<K, Set<V>>
or some such, aListMultimap<K, V>
orSetMultimap<K, V>
is what you really want.请改用多重贴图,选择一个使用列表的贴图,例如
ArrayListMultimap,这将允许受骗。
另外,您不必编写自己的反转方法,com.google.common.collect.Multimaps。
Use a Multimap instead, pick one that uses a list, like
ArrayListMultimap, that will allow dupes.
Also you don't have to write your own invert method, there's one provided in com.google.common.collect.Multimaps.
如果有人现在在这里绊倒(在 Java 的 Stream 时代),这里有两个基于单表达式 Stream 的解决方案:
1)基于
ImmutableListMultimap
< /a> +toImmutableListMultimap
收集器2) 基于
ArrayListMultimap
+Multimaps.toMultimap
收集器In case someone stumbles here now (well within Java's
Stream
era), here are two single-expressionStream
-based solutions:1) Immutable version based on
ImmutableListMultimap
+toImmutableListMultimap
collector2) Mutable version based on
ArrayListMultimap
+Multimaps.toMultimap
collector