Util用于旋转Map?

时间:2011-08-26 13:18:43

标签: java collections

Util libary(commonsXXX或其他)中是否有可以旋转Map的函数。

通过轮播我的意思是我有Map<User,Set<Permission>>应该“轮换”到Map<Permission,Set<User>>

我知道这并不难实现,但是使用一个普通的现有库似乎在“不要发明轮子两次”方面更好。

4 个答案:

答案 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个对象。