我知道你可以找到树集中的第一个和最后一个元素。如果我想知道没有迭代的第二个或第三个元素是什么怎么办?或者,更优选的是,给定一个元素,找出它在树集中的排名。
由于
编辑:我认为你可以使用tailset来做,即。将原始集的大小与尾部的大小进行比较。尾部效率如何?答案 0 :(得分:2)
TreeSet
未提供有效的排名方法。我怀疑(你可以通过查看它的来源确认)TreeSet
甚至没有维护任何额外的信息位(即每个节点的左右子树上的元素计数),这些信息需要执行这样的查询在O(log(n))时间。因此,似乎没有任何快速方法可以找到TreeSet
元素的等级。
如果你真的需要它,你可以用一个平衡的二进制搜索树实现你自己的SortedSet
,它允许这样的查询或修改TreeSet
实现来创建一个新的实现,它被扩充到允许这样的查询。有关如何实际完成此操作的更多详细信息,请参阅有关在CLRS中扩充数据结构的章节。
答案 1 :(得分:1)
除了迭代器之外别无他法。
编辑:
试试这个:
treeSet.higher(treeSet.first());
这应该在TreeSet上给出第二个元素。我不确定这是否比使用Iterator更优化。
答案 2 :(得分:1)
根据Sun JDK6实现的来源,tailSet(E).size()
遍历尾部集并计算元素,因此该调用为O(尾部集大小)。