在Java中,我有一个可能有100,000个元素的SortedSet。我想高效优雅地获得最后25个元素。我有点不解。
要获得第一个 25,我会迭代并停止25个元素。但我不知道如何以相反的顺序迭代。有什么想法吗?
SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
答案 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)
答案 6 :(得分:0)
我假设这不太可能在您的项目中实际使用,但值得注意的是,您可能只是能够将列表排序在相反的方向而不是:)