Util libary(commonsXXX或其他)中是否有可以旋转Map的函数。
通过轮播我的意思是我有Map<User,Set<Permission>>
应该“轮换”到Map<Permission,Set<User>>
?
我知道这并不难实现,但是使用一个普通的现有库似乎在“不要发明轮子两次”方面更好。
答案 0 :(得分: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
答案 1 :(得分: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;
}
答案 2 :(得分:0)
看看番石榴的BiMap.inverse()
。否则,您可以使用MapUtils.invertMap()
。
您可能已经想到了这一点,但是反转地图会要求键和值都是唯一的。
编辑仔细看看,我非常确定没有公开可用的组件可以为你做 。我将此问题视为将Map<A,B>
反转为Map<B,A>
。
答案 3 :(得分:0)
我认为你不太可能在某个实用程序库中找到类似的内容。
我之所以这样说,因为它不是您想要的简单反转,但您还需要从原始地图值中解压缩Permission
个对象。