2014-03-28 66 views
3

讓我們地圖:如何扭轉一個地圖

  • A - > {1,2,3}
  • 乙 - > {3,4,5}
  • Ç - > {2 ,3,5}

我需要扭轉此映射,將獲得:

  • 1 - > {A}
  • 2 - > {A,C}
  • 3 - > {A,B,C}
  • 4 - > {B}
  • 5 - > {B,C}

我實現使用此代碼:

public static <U, V> Map<V, Set<U>> reverseMap(Map<U, Set<V>> map) { 
    Map<V, Set<U>> result = Maps.newHashMap(); 
    for(Map.Entry<U, Set<V>> entry : map.entrySet()) { 
    for(V value : entry.getValue()) { 

     Set<U> set = result.get(value); 
     if(set == null) { 
     set = Sets.newHashSet(); 
     result.put(value, set); 
     } 
     set.add(entry.getKey()); 
     result.put(value, set); 
    } 

    } 
    return result; 
} 

但這只是一個反向索引,所以我認爲可能存在預定義的方法在某處做這件事。

有人知道這樣的圖書館嗎? Guava中的一種方法?

+1

我想你要找的是Multimaps(http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Multimaps),尤其是http://docs.guava-libraries.googlecode.com/ git-history/release/javadoc/com/google/common/collect/Multimaps.html#invertFrom%28com.google.common.collect.Multimap,%20M%29 –

+0

@ArnaudDenoyelle Hm,很對。我收回我的陳述。 – Smallhacker

回答

7

如果更換HashMap<U, Set<V>>HashMultimap<U, V>(他們是等價的,而Multimap更容易使用),你現在可以使用Multimaps.invertFrom()將填充Multimap<V, U>


注意,因爲Javadoc中提到,如果您使用的ImmutableMultimap,就可以直接調用ImmutableMultimap.inverse()

+0

我閱讀了https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Multimaps以瞭解。正是我需要的。謝謝 :) –