How can we do that with Guava? Notice the presence of List<K>
in the return type since many keys can map to the same value in any normal map.
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
seems to insist on the unicity of the values, but I don't have this luxury.
You can do this:
Map<K, V> map = ...;
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map),
ArrayListMultimap.<V,K>create());
Do note that pretty much any time you write Map<K, List<V>>
or Map<K, Set<V>>
or some such, a ListMultimap<K, V>
or SetMultimap<K, V>
is what you really want.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With