题
在爪哇我有可能有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() );
我猜想,这是不太可能的项目中的任何现实生活中使用,但值得注意的是,您可能只是能够在相反的方向排序的列表,而不是:)
不隶属于 StackOverflow