2012-11-23 1 views
10

私はTreeMultimapをトリムしようとしており、同じ構造のTreeMultimapが返されましたが、トリミングされています。たとえば、私は順序付けられていないニュースを返す異なるニュースプロバイダを持っています。私は日付でニュースをソートし、ソートされたマルチマップで最新の日付でこのソートを維持する必要があります。それから私は最新のXニュースを返す能力が必要です。日付ごとに、多くのニュースがあるかもしれません。Iterable/CollectionからTreeMultimapを作成するには?

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

全くトリム、またはTreeMultimapのサイズがないので、私はIterableを返し、それを使用して結果を制限するために管理してきましたが、どのようにIterableから新しいTreeMultimapを作成するには?

基本的に、アイデアがある:

  • は、できるだけ多くのエントリ(
  • Xにトリミングしてもマップに

を返す利用可能であるように置く新しいソートTreeMultimap

  • を作成たとえば、機能のようなページングを実装したい場合など、さまざまなデータセットはどうですか?

    最後の5つのニュースを返す方法はこちら

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

    しかし、結果から新しいMultimapを作成するにはどうすればよいですか?

    最も簡単な方法は、新しい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); 
    

    直接それを行うことができ、実際のユーティリティクラス/コンストラクタがある場合、私は思っていました。私が考えることができるのは、Iterablesを使用したこのアプローチでした。他のアプローチもあります。

  • +0

    'Iterable 'があり、その中から 'TreeMultimap'を作成しますか?ここではIterables#limitを見つけることはできませんhttp://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.htmlそれは何ですか? –

    +0

    こんにちは、これはGoogleのコレクションではなく、グアバです。 http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Iterables.html – Tony

    +0

    ああ、「Iterables.limit」は「Iterable」を返しますlast.Nexts(lastNews.entries()、5) '' Iterable 'をしたくないのですか? –

    答えて

    3

    あなたがすでにやっているやり方は、あなたがすべきことです。

    https://code.google.com/p/guava-libraries/issues/detail?id=320のディスカッションに関連すると思われます。 (これは実際にそれらのメソッドの実際の有効なユースケースのようです)

    関連する問題