在Util庫(CommonsXXX或其他)中是否有任何可以旋轉Map的函數?使用函數來旋轉地圖?
通過旋轉我的意思是我有一個Map<User,Set<Permission>>
,應該是「旋轉」到Map<Permission,Set<User>>
?
我知道這並不難實現,但採用通用現有的庫似乎是在以下方面更好地「不發明輪子的兩倍」。
在Util庫(CommonsXXX或其他)中是否有任何可以旋轉Map的函數?使用函數來旋轉地圖?
通過旋轉我的意思是我有一個Map<User,Set<Permission>>
,應該是「旋轉」到Map<Permission,Set<User>>
?
我知道這並不難實現,但採用通用現有的庫似乎是在以下方面更好地「不發明輪子的兩倍」。
我需要做同樣的事情,你的描述,我用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
看一看番石榴的BiMap.inverse()
。否則,您可以使用MapUtils.invertMap()
。
你可能想到了這一點,但扭轉了地圖將需要鍵以及值是唯一的。
編輯在仔細一看,我敢肯定,沒有公開可用的組件會做是你。我將這個問題翻譯爲Map<A,B>
至Map<B,A>
。
我不確定這是否會執行。 'inverse()'將返回'Map
我認爲這是不太可能,你會發現在一些實用程序庫類似的東西。
我在說,因爲它不是一個簡單的反演,而是需要從原始地圖值中解開Permission
對象。
番石榴有它。 :-) –
我沒有在公共圖書館找到這兩種,所以這裏是我的實現:
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;
}
你有沒有考慮引入UserPermission類位於多對多關係之間?您可以輕鬆遍歷所有UserPermissions,並創建具有所需結構的兩個multimap。 –
@Javid Jamae:不那麼複雜,地圖甚至不能連接。旋轉的可以是未連接的副本。 – Ralph