2012-11-23 15 views
10

Sto provando a tagliare un TreeMultimap e ho restituito lo stesso strutturato (ma tagliato). Ad esempio, ho diversi fornitori di notizie che restituiscono notizie non ordinate. Ho bisogno di ordinare le notizie per data e mantenere questo tipo nella multimappa ordinata per data più recente. Quindi ho bisogno della possibilità di restituire le ultime notizie di X. Per data, ci possono essere molte notizie.Come creare un TreeMultimap da Iterable/Collection?

TreeMultimap<Date, String> latestNews = TreeMultimap.create(Ordering.natural().reverse(), Ordering.natural()); 

Perché non c'è trim, o la dimensione del TreeMultimap, sono riuscito a restituire un Iterable e limitare i risultati con quello, ma come creare una nuova TreeMultimap dalla Iterable?

In sostanza, l'idea è:

  • creare nuova ordinato TreeMultimap
  • mettere tante voci quante sono disponibili (
  • trim per X e tornare la mappa

Inoltre, per quanto riguarda diversi insiemi di dati, ad esempio, se voglio implementare funzionalità simili di paging?

Ecco come restituire le ultime 5 notizie ad esempio

Map.Entry<Date, String> lastFiveNews = Iterables.limit(latestNews.entries(), 5) 

Ma come si crea un nuovo multimap dal risultato?

modo più semplice sarebbe così semplice come l'iterazione e la creazione di un nuovo TreeMultimap:

TreeMultimap<Date, String> lastFiveNews = TreeMultimap.create(Ordering.natural().reverse(), Ordering.natural()); 

for (Map.Entry<Date, String> dateStringEntry : Iterables.limit(latestNews.entries(), 5)) { 
    lastFiveNews.put(dateStringEntry.getKey(), dateStringEntry.getValue()); 
} 
latestNews.clear(); 
latestNews.putAll(lastFiveNews); 

Mi chiedevo se esiste una reale classe di utilità/costruttore che può farlo direttamente. Questo approccio usando gli Iterables era l'unico a cui potessi pensare. Ci possono essere anche altri approcci.

+0

Quindi hai "Iterable " e vuoi creare un 'TreeMultimap' da quello? Non riesco a trovare "Iterables # limit" qui http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html che cosa fa? –

+0

Ciao, questo è Guava, non le raccolte di google. http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Iterables.html – Tony

+0

Ahh okay, "Iterables.limit' restituisce un' Iterable' così fa questo non si rompe, 'Map.Entry lastFiveNews = Iterables.limit (latestNews.entries(), 5)' Non vuoi 'Iterable '? –

risposta