Java 如何获取SortedSet的最后25个元素?

Java 如何获取SortedSet的最后25个元素?,java,sortedset,Java,Sortedset,在Java中,我有一个可能包含100000个元素的SortedSet。我想高效优雅地获得最后25个元素。我有点困惑 为了得到前25个元素,我迭代并在25个元素之后停止。但我不知道如何以相反的顺序迭代。有什么想法吗 SortedSet<Integer> summaries = getSortedSet(); // what goes here :-( SortedSet summaries=getSortedSet(); //这里说的是:-( 您需要一个NavigableSet。否则

在Java中,我有一个可能包含100000个元素的SortedSet。我想高效优雅地获得最后25个元素。我有点困惑

为了得到前25个元素,我迭代并在25个元素之后停止。但我不知道如何以相反的顺序迭代。有什么想法吗

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
SortedSet summaries=getSortedSet();
//这里说的是:-(

您需要一个
NavigableSet
。否则,您将不得不低效地执行此操作,迭代整个
SortedSet
,并将元素收集到一个
队列中,将其修剪为25个元素。

不同的数据结构更适合此操作

这不是一种优雅的方式,也不是很有效,但假设SortedSet是按升序排列的,则可以得到最后一个()项并将其删除,将其存储在另一个列表中,然后重复25次。然后您必须将这些元素重新放回!

SortedSet
的设计假设了一个非常简单的迭代模型,仅向前,因此查找前n个条目很容易,但查找最后一个条目需要花费高昂的成本,通过维护wi的迭代器读取最后n个条目的ndow

添加1.6解决了这个问题(1.4 TreeSet中唯一的SortedSet实现实现了它,因此它很可能是您的替代品)

NavigableSet集=新树集();
//添加元素
set.degenerationIterator()//根据需要迭代最后n个实体

我假设这在您的项目中不太可能有任何实际用途,但值得注意的是,您可以简单地将列表按相反方向排序:)

将集合放入列表并使用subList()。我不确定创建列表的性能如何,因此您必须运行一些测试。不过,这肯定会使编码变得简单

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

将你的分类倒过来,取前25项。然后,您可以撤销那些将是有效的,因为它只有25个项目

布鲁斯

你可能想看看这本书


使用exact(size-25)无需迭代即可到达索引处的元素。

NavigableSet已添加到Java 6中。上周,我很方便地将代码库从Java5更新为Java6!已排序的集合。。。安东·戈戈列夫:看看维基百科的“总体顺序”文章。这个答案把b树的顶端和它所包含的第一个元素混淆了——它们是不同的。为了避免否决票,应该对其进行更正,否则这是一个正确的答案。J6之前的系列的基本问题是单向导航(仅向前)。
    List f = new ArrayList( summaries);
    List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );