2012-06-27 10 views
7

estoy usando Google guayaba 12 y tener un mapa:cómo puedo filtrar entradas de mapa basado en conjunto de entradas

Map<OccupancyType, BigDecimal> roomPrice; 

Tengo un conjunto:

Set<OccupancyType> policy; 

Cómo puedo filtrar las entradas en el roomPrice map basado en policy y devolver el mapa filtrado?

filteredMap necesita tener todos los valores de policy. En caso de que el mapa de roomPrice no tenga una entrada desde la política, me gustaría ingresar el valor predeterminado en su lugar.

Respuesta

27

Como tiene un Juego de llaves, debe usar Maps.filterkeys(), también Guava proporciona un conjunto bastante bueno de predicados que puede usar de fábrica. En tu caso, debería funcionar algo como Predicates.in().

Así que, básicamente, se termina con:

Map<OccupancyType, BigDecimal> filteredMap 
    = Maps.filterKeys(roomPrice, Predicates.in(policy)); 

espero que ayude.

+0

¡Gracias! Todavía soy muy nuevo en Predicates y no estoy seguro de cómo generará un predicado que funcione en mi mapa. Además, ¿hay alguna manera de garantizar, filterMap debe tener todos los valores de la política. En caso de que el mapa de roomPrice no tenga una entrada desde la política, me gustaría ingresar el valor predeterminado en su lugar. – brainydexter

+0

Si tiene un mapa con entradas "predeterminadas", puede hacer algo como: filteredMap.putAll (Maps.difference (filteredMap, defaultMap) .entriesOnlyOnRight()); –

+1

Además, puedes echar un vistazo a este artículo: http://scaramoche.blogspot.de/2010/08/googles-guava-library-tutorial-part-4.html Tiene algunos buenos ejemplos de uso de predicados. –

2
  • sustituir e implementar equals y hashcode en OccupancyType.
  • Pasa el cerrojo a través del conjunto de claves roomPrice y recoge los elementos contenidos en el filtro.

Algo como esto:

Map<OccupancyType, BigDecimal> filteredPrices = new HashMap<OccupancyType, BigDecimal>(); 
for(OccupancyType key : roomPrice.keySet()) { 
    if(policy.contains(key) { 
     filteredPrices.put(key, roomPrice.get(key)); 
    } 
} 

actualización

Ok después de leer un poco en Google guayaba, usted debería ser capaz de hacer algo como:

Predicate<OccupancyType> priceFilter = new Predicate<OccupancyType>() { 
    public boolean apply(OccupancyType i) { 
     return policy.contains(i); 
    } 
}; 

y luego

return Maps.filterValues(roomPrice, priceFlter); 

deberían hacer el truco.

+0

Gracias! Sé que funcionaría, pero también estoy aprendiendo a usar guayaba. Esperaba usar algo del tipo de Maps.filterEntries (...) [link] (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/ collect/Maps.html # filterEntries (java.util.Map, com.google.commonmon.base.Predicate)) [/ link] de google-guava. ¿Tendría alguna idea de cómo podría hacer lo anterior con eso? – brainydexter

+0

Ok, he actualizado mi respuesta después de leer sobre eso. ¡Déjenme saber si funciona! – Jeshurun

+0

¿No crees que debería ser 'Maps.filterEntries (roomPrice, priceFilter);' – brainydexter