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

lac*_*547 15 java collections guava

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

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;        
}
Run Code Online (Sandbox Code Playgroud)

BiMap 似乎坚持价值观的独特性,但我没有这种奢侈.

Col*_*inD 31

你可以这样做:

Map<K, V> map = ...;
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map), 
    ArrayListMultimap.<V,K>create());
Run Code Online (Sandbox Code Playgroud)

做几乎任何时候你写笔记Map<K, List<V>>Map<K, Set<V>>或一些这样的,一个ListMultimap<K, V>或者SetMultimap<K, V>是你真正想要的.

  • @ lacroix1547嗯?`Multimaps.forMap()`返回给定地图的_view_.它几乎没有工作......它只是调用一个构造函数并将地图分配给一个字段.而已.考虑它是一个适配器,它允许你使用一个像`invertFrom()`这样的方法的地图,它们期望一个`Multimap`. (2认同)

Nat*_*hes 7

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

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