2012-11-23 7 views
10

Próbuję przyciąć TreeMultimap i mieć ten sam zorganizowany TreeMultimap wrócił (ale przycięte). Na przykład mam różnych dostawców wiadomości, które zwracają nieuporządkowane wiadomości. Muszę posortować wiadomości według daty i utrzymać ten rodzaj w posortowanym multimapie według najnowszej daty. Wtedy potrzebuję możliwości zwrócenia najnowszych wiadomości X. Na dzień może być wiele nowości.Jak utworzyć TreeMultimap z Iterable/Collection?

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

ponieważ nie ma wykończenia lub rozmiaru TreeMultimap, udało mi się zwrócić Iterable i ograniczyć wyniki z tym, ale jak utworzyć nową TreeMultimap z Iterable?

Zasadniczo pomysł jest:

  • utworzyć nowy klasyfikowane TreeMultimap
  • umieścić dowolną liczbę wpisów nie są dostępne (
  • przyciąć do X i powrócić mapie

także a co z różnymi zestawami danych, na przykład, czy chcę zaimplementować funkcje stronicowania?

Oto, jak zwrócić 5 ostatnich wiadomości, na przykład:

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

Ale jak utworzyć nowy Multimap z wyniku?

Najprostszym sposobem byłoby tak proste, jak iteracji i tworzenia nowego 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); 

Zastanawiałem się, czy istnieje rzeczywista klasa narzędzie/konstruktor, że może to zrobić bezpośrednio. To podejście wykorzystujące Iterables było jedyną, o której mogłem pomyśleć. Mogą być również inne podejścia.

+0

Więc masz 'Iterable ' i chcesz utworzyć 'TreeMultimap' z tego? Nie mogę znaleźć 'Limitu Iterables # tutaj http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html co to robi? –

+0

Witam, to jest Guava, a nie kolekcje google. http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Iterables.html – Tony

+0

Ahh okay, 'Iterables.limit' zwraca' Iterable', więc robi to nie przerywać, 'Map.Entry lastFiveNews = Iterables.limit (latestNews.entries(), 5)' Nie chcesz 'Iterable '? –

Odpowiedz