2010-09-09 13 views
12

Bunu Guava ile nasıl yapabiliriz? Dönüş türünde List<K> varlığına dikkat edin, çünkü birçok tuş herhangi bir normal haritadaki aynı değere eşlenebilir. Eşsiz değerler ile Guava ile harita inversiyonu nasıl yapılır?

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

değerlerin, Unicity ısrar görünüyor, ama bu lüksümüz yok.

cevap

27

Bunu yapabilirsin:

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

hemen hemen her zaman Map<K, List<V>> veya Map<K, Set<V>> ya da bazı tür, yazma not Do ListMultimap<K, V> veya SetMultimap<K, V> gerçekten ne istediğini bir.

+0

Güzel, bu hızlıydı. – lacroix1547

+1

Ancak, Multimap'a dönüştürmek zorunda kalmak can sıkıcı bir durumdur. Ve performanslara gösterdikleri çaba göz önüne alındığında, gelecekte daha seksi bir şeyle geliştirilebilir. – lacroix1547

+2

@ lacroix1547 Huh? 'Multimaps.forMap()', verilen haritanın _view_ değerini döndürür. Neredeyse hiç iş yok ... sadece bir kurucu çağırıyor ve haritayı bir alana atar. Bu kadar. Bir haritayı, bir "Çok Noktalı" bekleyeni "invertFrom()" gibi yöntemlerle kullanmanızı sağlayan bir bağdaştırıcıyı düşünün. – ColinD