2010-09-09 25 views
12

我們如何用番石榴做到這一點?注意返回類型中存在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似乎堅持價值的唯一性,但我沒有這種奢侈。

回答

27

你可以這樣做:

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>是你真正想要的。

+0

不錯,那很快。 – lacroix1547 2010-09-09 16:58:51

+1

但是,被迫轉換爲Multimap令人討厭。考慮到他們爲表演付出的努力,未來可能會有所改進,並帶來更多性感。 – lacroix1547 2010-09-09 17:16:26

+2

@ lacroix1547咦? 'Multimaps.forMap()'返回給定地圖的_view_。它幾乎沒有工作......它只是調用構造函數並將地圖分配給一個字段。而已。考慮一下它是一個適配器,它允許你使用像'invertFrom()'這樣的需要'Multimap'的方法。 – ColinD 2010-09-09 17:24:55