Подтвердить что ты не робот

Как сделать преобразование карты с помощью Guava с неповторимыми значениями?

Как мы можем это сделать с Гуавой? Обратите внимание на наличие List<K> в возвращаемом типе, поскольку многие клавиши могут сопоставлять одно и то же значение в любой нормальной карте.

public static <K, V> Map<V, List<K>> inverse(Map<K, V> map){
    Map<V, List<K>> result = new LinkedHashMap<V, List<K>>();
    for (Map.Entry<K, V> entry : map.entrySet()) {
        if(!result.containsKey(entry.getValue())){
            result.put(entry.getValue(), new ArrayList<K>());                
        }
        result.get(entry.getValue()).add(entry.getKey());
    }        
    return result;        
}

BiMap, похоже, настаивает на единстве ценностей, но у меня нет этой роскоши.

4b9b3361

Ответ 1

Вы можете сделать это:

Map<K, V> map = ...;
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map), 
    ArrayListMultimap.<V,K>create());

Заметьте, что в любой момент, когда вы пишете Map<K, List<V>> или Map<K, Set<V>> или некоторые такие, ListMultimap<K, V> или SetMultimap<K, V> - это то, что вы действительно хотите.

Ответ 2

Вместо этого используйте Multimap, выберите тот, который использует список, например ArrayListMultimap, что позволит обманывать.

Также вам не нужно писать свой собственный метод инвертирования, там один из com.google.common.collect.Multimaps.