在爪哇我有可能有100000个元件SortedSet的。我想高效,优雅获得最后25个元素。我有点疑惑。

要获得的第一的25我会遍历和后25个元素停止。但我不知道如何以相反的顺序进行迭代。任何想法?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
有帮助吗?

解决方案

您需要NavigableSet。否则,你就必须低效做到这一点,在整个SortedSet迭代和收集元素融入你一直在25元修剪一个Queue

其他提示

SortedSet<T>被设计假定一个非常简单的迭代模型,只向前,从而找到前n个条目是容易的,但发现最后将需要通过迭代保持最后n个条目的窗口昂贵的读操作。

NavigableSet<T> 加入在1.6解决了此(及唯一的SortedSet从1.4 TreeSet中实现实现它,所以它很可能是在更换为你的下降)。

NavigableSet<T> set = new TreeSet<T>();
// add elements
set.descendingIterator() // iterate over the last n entires as needed

反向您的排序,并采取第25个项目。然后,可以反转那些将高效作为其唯一的25个项目。

布鲁斯

一个不同的数据结构将是更适合于这种操作。

这是不是一种优雅的方式还是很有效的的,但假设的SortedSet是按升序排列,你可以得到最后的()项,删除它,把它存储在另一个列表,重复25次。然后,您将不得不再次把这些元素!

您可能想看看的 IndexedTreeMap 索引树地图

使用精确(大小-25),以获得所述元件在索引而不迭代。

投掷的集成列表,并使用子列表()。我不知道它是多么高性能创建列表,所以你必须运行一些测试。这当然会做的编码容易做。

    List f = new ArrayList( summaries);
    List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );

我猜想,这是不太可能的项目中的任何现实生活中使用,但值得注意的是,您可能只是能够在相反的方向排序的列表,而不是:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top