如何使用具有非唯一值的番石榴进行地图反转?

2022-09-02 11:51:23

我们怎么能用番石榴做到这一点?请注意返回类型中存在 ,因为许多键可以映射到任何法线映射中的相同值。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;        
}

BiMap似乎坚持价值观的单一性,但我没有这种奢侈。


答案 1

您可以执行以下操作:

Map<K, V> map = ...;
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map), 
    ArrayListMultimap.<V,K>create());

请注意,几乎任何时候你写或诸如此类,一个或都是你真正想要的。Map<K, List<V>>Map<K, Set<V>>ListMultimap<K, V>SetMultimap<K, V>


答案 2

请改用 Multimap,选择一个使用列表(如 ArrayListMultimap)的多映射,这将允许重复。

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