我们如何用番石榴来做到这一点?注意List<K>返回类型的存在,因为许多键可以在任何法线映射中映射到相同的值。
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 似乎坚持价值观的统一性,但我没有这种奢侈。
BiMap
你可以这样做:
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>>类似内容时,a ListMultimap<K, V>或a SetMultimap<K, V>都是您真正想要的。
Map<K, List<V>>
Map<K, Set<V>>
ListMultimap<K, V>
SetMultimap<K, V>