我们怎样才能用番石榴做到这一点?请注意返回类型中存在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
似乎坚持价值观的独特性,但我没有这种奢侈。
答案 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));