如何使用具有非唯一值的Guava进行地图反演?

时间:2010-09-09 16:36:56

标签: java collections 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似乎坚持价值观的独特性,但我没有这种奢侈。

3 个答案:

答案 0 :(得分:30)

你可以这样做:

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>都是您真正想要的。

答案 1 :(得分:7)

使用Multimap,选择一个使用列表的,例如 ArrayListMultimap,这将允许欺骗。

此外,您不必编写自己的反转方法,com.google.common.collect.Multimaps中提供了一种方法。

答案 2 :(得分:1)

万一有人偶然来到这里(在Java的Private Const ERR_CUSTOM_ERROR_1 = vbObjectError + 42 Public Enum UserFacingError ErrFooWasNotBarred = &H7E1 ErrSomething ErrSomethingElse End Enum '... Public Function DoSomething(ByVal foo As Long) As Variant On Error GoTo ErrHandler '..."happy path"... Exit Function ErrHandler: Select Case Err.Number Case 5 'Invalid procedure call/argument DoSomething = CVErr(ErrFooWasNotBarred) Case ERR_CUSTOM_ERROR_1 DoSomething = CVErr(ErrSomething) Case Else DoSomething = CVErr(ErrSomethingElse) End Select End Function 时代),这里有两个基于单表达式Stream的解决方案:

1)基于ImmutableListMultimap + toImmutableListMultimap收集器的不可变版本

Stream

2)基于ArrayListMultimap + Multimaps.toMultimap收集器的可变版本

ImmutableListMultimap<V, K> output = inputMap.entrySet().stream()
        .collect(ImmutableListMultimap.toImmutableListMultimap(Map.Entry::getValue, Map.Entry::getKey));