2012-06-27 14 views
7

sto usando google guava 12 e avere una mappa:come posso filtrare voci della mappa in base a serie di voci

Map<OccupancyType, BigDecimal> roomPrice; 

Ho un Set:

Set<OccupancyType> policy; 

Come posso filtrare le voci nel roomPrice map basato su policy e restituire la mappa filtrata?

filteredMap deve avere tutti i valori da policy. Nel caso, la mappa di roomPrice non ha una voce dalla policy, vorrei invece inserire il valore di default.

risposta

27

Poiché si dispone di un set di chiavi, è necessario utilizzare Maps.filterkeys(), inoltre Guava fornisce un set di predicati piuttosto buono che è possibile utilizzare immediatamente. Nel tuo caso qualcosa come Predicates.in() dovrebbe funzionare.

Quindi, in pratica si finisce con:

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

Speranza che aiuta.

+0

Grazie! Sono ancora molto nuovo ai Predicati e non sono sicuro di come genererà un predicato che funzionerebbe sulla mia mappa. Inoltre, esiste un modo per garantire che filteredMap abbia tutti i valori della policy. Nel caso, la mappa di roomPrice non ha una voce dalla policy, vorrei invece inserire il valore di default. – brainydexter

+0

Se si dispone di una mappa con voci "predefinite", si può fare qualcosa come: filteredMap.putAll (Maps.difference (filteredMap, defaultMap) .entriesOnlyOnRight()); –

+1

Inoltre, puoi dare un'occhiata a questo articolo: http://scaramoche.blogspot.de/2010/08/googles-guava-library-tutorial-part-4.html Ha alcuni buoni esempi di utilizzo di Predicate. –

2
  • sostituire e implementare equals e hashcode in OccupancyType.
  • Passare attraverso il set di chiavi roomPrice e raccogliere gli elementi contenuti nel filtro.

Qualcosa di simile a questo:

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

Aggiornamento

Ok dopo aver letto un po 'su Google Guava, si dovrebbe essere in grado di fare qualcosa di simile:

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

e quindi

return Maps.filterValues(roomPrice, priceFlter); 

dovrebbe fare il trucco.

+0

Grazie! So che funzionerebbe, ma sto anche imparando a usare guava. Speravo di usare qualcosa dei tipi di Maps.filterEntries (...) [collegamento] (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/ collect/Maps.html # filterEntries (java.util.Map, com.google.common.base.Predicate)) [/ link] di google-guava. Avresti qualche idea su come potrei fare quanto sopra? – brainydexter

+0

Ok, ho aggiornato la mia risposta dopo aver letto un po ', fatemi sapere se funziona! – Jeshurun

+0

Non pensate che dovrebbe essere 'Maps.filterEntries (roomPrice, priceFilter);' – brainydexter

Problemi correlati