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。我想是对的:)他们在表演上下了功夫。