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

时间:2009-02-24 13:13:55

标签: java sortedset

在Java中,我有一个可能有100,000个元素的SortedSet。我想高效优雅地获得最后25个元素。我有点不解。

要获得第一个 25,我会迭代并停止25个元素。但我不知道如何以相反的顺序迭代。有什么想法吗?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(

7 个答案:

答案 0 :(得分:15)

您需要NavigableSet。否则你将不得不低效地完成它,迭代整个SortedSet并将元素收集到Queue中,你将被修剪为25个元素。

答案 1 :(得分:4)

SortedSet <T>的设计假设一个非常简单的迭代模型,仅向前,因此找到前n个条目很容易,但找到最后一个将需要通过迭代器进行昂贵的读取,维护最后n个条目的窗口。

NavigableSet<T>在1.6中添加解决了这个问题(并且1.4 TreeSet中唯一的SortedSet实现实现了它,因此很可能替代你)。

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

答案 2 :(得分:3)

撤消您的排序并获取前25项。然后,您可以将那些效率仅为25项的那些项目反转。

布鲁斯

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

将Set放入List并使用subList()。我不确定创建List的性能如何,所以你必须运行一些测试。它确实使编码变得容易。

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

答案 5 :(得分:1)

您可能需要查看IndexedTreeMap

中的indexed-tree-map

使用exact(size-25)在没有迭代的情况下到达索引处的元素。

答案 6 :(得分:0)

我假设这不太可能在您的项目中实际使用,但值得注意的是,您可能只是能够将列表排序在相反的方向而不是:)