Java 如何使用非唯一值的番石榴进行地图反演?
我们用番石榴怎么做?注意返回类型中存在Java 如何使用非唯一值的番石榴进行地图反演?,java,collections,guava,Java,Collections,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> en
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;
}
公共静态映射反转(映射映射){
映射结果=新建LinkedHashMap();
对于(Map.Entry:Map.entrySet()){
如果(!result.containsKey(entry.getValue())){
put(entry.getValue(),new ArrayList());
}
result.get(entry.getValue()).add(entry.getKey());
}
返回结果;
}
BiMap
似乎坚持价值的单一性,但我没有这种奢侈。使用多重地图,选择一个使用列表的地图,如
,这将允许重复
此外,您不必编写自己的反转方法,中提供了一种。您可以这样做:
Map<K, V> map = ...;
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map),
ArrayListMultimap.<V,K>create());
Map=。。。;
ListMultimap inverse=多重映射.inversfrom(多重映射.forMap(映射)),
ArrayListMultimap.create());
请注意,几乎每当您编写
Map
或Map
或类似的东西时,您真正想要的就是ListMultimap
或setmulimap
。如果现在有人在这里绊倒(在Java的Stream
时代),这里有两个基于单表达式Stream
的解决方案:
1) 基于+收集器的不可变版本
ImmutableListMultimap<V, K> output = inputMap.entrySet().stream()
.collect(ImmutableListMultimap.toImmutableListMultimap(Map.Entry::getValue, Map.Entry::getKey));
ListMultimap<V, K> output = inputMap.entrySet().stream()
.collect(Multimaps.toMultimap(Map.Entry::getValue, Map.Entry::getKey, ArrayListMultimap::create));
但是,被迫转换为多重映射是令人恼火的。考虑到他们在表演上付出的努力,未来可能会有所改进,会有更性感的东西。@lacroix1547,嗯
Multimaps.forMap()
返回给定地图的视图。它几乎不起作用。。。它只调用构造函数并将映射分配给字段。就这样。考虑它是一个适配器,它允许你使用一个映射,比如“代码>反义词”(<代码> >,期望一个<代码> MultIMAP 。是的,我没有打开FAMAP。我想是对的:)他们在表演上下了功夫。