Использовать функцию для поворота карты? - PullRequest
3 голосов
/ 26 августа 2011

Есть ли в библиотеке Util какая-либо функция (commonsXXX или что-то еще), которая может вращать карту.

Вращаясь, я имею в виду, что у меня есть Map<User,Set<Permission>>, который должен быть "повернут" до Map<Permission,Set<User>>?

Я знаю, что это не сложно реализовать, но использование общей существующей библиотеки, кажется, лучше с точки зрения "не изобретай колесо дважды".

Ответы [ 4 ]

4 голосов
/ 26 августа 2011

Мне нужно было сделать то же самое, что вы описываете, я использовал мультикарту из общих коллекций и написал свою собственную обратную функцию. (Это было по крайней мере 3 года назад с использованием jdk1.4, поэтому guava не был вариантом.)

Но если вы изменили исходную карту на SetMultimap (я в любом случае предпочитаю мультикарты при сопоставлении ключей с коллекциями значений, поскольку они упрощают вставку значений), тогда вы можете использовать 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 голос
/ 16 июля 2013

Я также не нашел этого в общих библиотеках, так что вот моя реализация:

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;
}
0 голосов
/ 26 августа 2011

Я думаю, что вряд ли вы найдете что-то подобное в некоторой служебной библиотеке.

Я говорю это, потому что вы ищете не простую инверсию, но вам также нужнораспакуйте Permission объекты из исходных значений карты.

0 голосов
/ 26 августа 2011

Посмотрите на Guava's BiMap.inverse().В противном случае вы можете использовать MapUtils.invertMap().

Вы, наверное, подумали об этом, но для изменения карты потребовались бы ключи и значения, чтобы быть уникальными.

РЕДАКТИРОВАТЬ При ближайшем рассмотрении я почти уверен, что ни один общедоступный компонент не сделает , что для вас.Я прочитал вопрос как инвертировать Map<A,B> в Map<B,A>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...