2011-08-26 28 views
3

在Util庫(CommonsXXX或其他)中是否有任何可以旋轉Map的函數?使用函數來旋轉地圖?

通過旋轉我的意思是我有一個Map<User,Set<Permission>>,應該是「旋轉」到Map<Permission,Set<User>>

我知道這並不難實現,但採用通用現有的庫似乎是在以下方面更好地「不發明輪子的兩倍」。

+0

你有沒有考慮引入UserPermission類位於多對多關係之間?您可以輕鬆遍歷所有UserPermissions,並創建具有所需結構的兩個multimap。 –

+0

@Javid Jamae:不那麼複雜,地圖甚至不能連接。旋轉的可以是未連接的副本。 – Ralph

回答

4

我需要做同樣的事情,你的描述,我用commons-collections提供多重映射和寫我自己的反函數。 (這是至少3年前,使用jdk1.4,所以番石榴不是一種選擇。)

但是,如果你改變你的原始地圖爲SetMultimap(我更喜歡multimaps當映射鍵值集合​​,因爲它們使插入值容易),那麼你可以使用com.google.common.collect.Multimaps.invertFrom

public static <K,V,M extends Multimap<K,V>> M invertFrom(Multimap<? extends V,? extends K> source, 
             M dest) 

Copies each key-value mapping in source into dest, with its key and value reversed. 

Parameters: 
    source - any multimap 
    dest - the multimap to copy into; usually empty 
Returns: 
    dest 
0

看一看番石榴的BiMap.inverse()。否則,您可以使用MapUtils.invertMap()

你可能想到了這一點,但扭轉了地圖將需要鍵以及值是唯一的。

編輯在仔細一看,我敢肯定,沒有公開可用的組件會做你。我將這個問題翻譯爲Map<A,B>Map<B,A>

+0

我不確定這是否會執行。 'inverse()'將返回'Map ,User>'。 – musiKk

0

我認爲這是不太可能,你會發現在一些實用程序庫類似的東西。

我在說,因爲它不是一個簡單的反演,而是需要從原始地圖值中解開Permission對象。

+2

番石榴有它。 :-) –

1

我沒有在公共圖書館找到這兩種,所以這裏是我的實現:

public static <K, V> Map<V, Set<K>> invertMapToSet(Map<K, ? extends Set<V>> ksToVs) { 
    Map<V, Set<K>> vsToKs = new HashMap<V, Set<K>>(); 
    for (Entry<K, ? extends Set<V>> kToVs : ksToVs.entrySet()) { 
     for (V v : kToVs.getValue()) { 
      Set<K> ks = vsToKs.get(v); 
      if (ks == null) { 
       ks = new HashSet<K>(); 
       vsToKs.put(v, ks); 
      } 
      ks.add(kToVs.getKey()); 
     } 
    } 
    return vsToKs; 
}