2010-09-09 5 views
12

¿Cómo podemos hacer eso con guayaba? Observe la presencia de List<K> en el tipo de devolución ya que muchas teclas se pueden asignar al mismo valor en cualquier mapa normal.¿Cómo hacer inversión de mapa con Guava con valores no únicos?

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 parece insistir sobre la unicidad de los valores, pero no tienen este lujo.

Respuesta

27

Usted puede hacer esto:

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

tenga en cuenta que casi cualquier momento de escribir Map<K, List<V>> o Map<K, Set<V>> o algo así, un ListMultimap<K, V> o SetMultimap<K, V> es lo que realmente quiere.

+0

Bien, eso fue rápido. – lacroix1547

+1

Pero es molesto ser forzado a convertir a Multimap. Y considerando el esfuerzo que ponen en las actuaciones, se puede mejorar en el futuro, con algo más sexy. – lacroix1547

+2

@ lacroix1547 ¿Huh? 'Multimaps.forMap()' devuelve una _view_ del mapa dado. Casi no funciona ... solo llama a un constructor y asigna el mapa a un campo. Eso es. Considérelo un adaptador que le permite usar un mapa con métodos como 'invertFrom()' que esperan un 'Multimap'. – ColinD