如何从Iterable / Collection创建TreeMultimap?

时间:2012-11-23 10:21:36

标签: java guava

我正在尝试修剪TreeMultimap,并返回相同的结构TreeMultimap(但已修剪)。例如,我有不同的新闻提供者返回无序新闻。我需要按日期对新闻进行排序,并按照最近的日期在排序的多图中保持这种排序。然后我需要能够返回最新的X新闻。每个日期,可能有很多新闻。

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

由于没有TreeMultimap的修剪或大小,我设法返回Iterable并限制结果,但是如何从中创建新的TreeMultimap Iterable

基本上,这个想法是:

  • 创建新的已排序的TreeMultimap
  • 放入尽可能多的条目(
  • 修剪为X并返回地图

另外,如果我想实现类似分页的功能,那么不同的数据集呢?

以下是如何返回最后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的这种方法是我能想到的唯一方法。也可能有其他方法。

1 个答案:

答案 0 :(得分:3)

你已经采取的方式正是你应该做的。

您可能对https://code.google.com/p/guava-libraries/issues/detail?id=320的相关讨论感兴趣。 (实际上,这似乎是这些方法的实际有效用例。)