Java.util包中是否有可索引的排序列表?

Java.util包中是否有可索引的排序列表?,java,data-structures,collections,sortedlist,Java,Data Structures,Collections,Sortedlist,我正在java.util包中寻找数据结构。我需要它满足以下要求: 元素的数量(理论上)是无界的 元素按升序排序 您可以获得第n个元素(fast) 您可以删除第n个元素(fast) 我希望找到一个可索引的跳过列表,但我没有。他们的数据结构是否符合我所说的要求 看看 如果您的数据结构中不需要类似的元素,那么通常的树集也适合您的要求。TreeSet在向列表中添加元素时为您提供自然排序的功能。 但是,如果您不需要这个集合,并且允许使用Collections.sort(),您可以使用simpleArr

我正在java.util包中寻找数据结构。我需要它满足以下要求:

  • 元素的数量(理论上)是无界的
  • 元素按升序排序
  • 您可以获得第n个元素(fast)
  • 您可以删除第n个元素(fast)
我希望找到一个可索引的跳过列表,但我没有。他们的数据结构是否符合我所说的要求

看看


如果您的数据结构中不需要类似的元素,那么通常的树集也适合您的要求。

TreeSet
在向列表中添加元素时为您提供自然排序的功能。
但是,如果您不需要这个集合,并且允许使用Collections.sort(),您可以使用simple
ArrayList

这个问题与

看一看

它基本上建议如下:

class SortedArrayList<T> extends ArrayList<T> {

    @SuppressWarnings("unchecked")
    public void insertSorted(T value) {
        add(value);
        Comparable<T> cmp = (Comparable<T>) value;
        for (int i = size()-1; i > 0 && cmp.compareTo(get(i-1)) < 0; i--) {
            T tmp = get(i);
            set(i, get(i-1));
            set(i-1, tmp);
        }
    }
}
class SorterDarrayList扩展了ArrayList{
@抑制警告(“未选中”)
公共void insertSorted(T值){
增加(价值);
可比cmp=(可比)值;
对于(int i=size()-1;i>0&&cmp.compareTo(get(i-1))<0;i--){
T tmp=get(i);
set(i,get(i-1));
装置(i-1,tmp);
}
}
}

关于第一个要求的注释:“元素的数量是无限的。”


您可能希望将此限制为“元素的数量不应少于231-1…”,因为否则您将排除所有由Java数组支持的选项。(例如,使用LinkedList,您可以避开任意数量的元素,但我看不出如何快速查找。)

考虑将
列表
集合相结合。sort()

不存在满足所有条件的简单数据结构


我所知道的唯一一个能够满足这些要求的是一个。无论如何,我不知道有任何现成的Java实现。

按照dwb对
List
Collections.sort()的说明,您可以使用
ArrayList
实现
List
(当然,除非您需要这种开销,否则不会像
Vector
那样同步)。这可能是你最好的选择,因为他们(Sun)通常会对这些领域进行大量研究(从我所看到的情况来看)。如果您需要按照“默认值”以外的方式进行排序(即,您没有对整数列表进行排序,等等),那么请提供您自己的比较器


编辑:唯一不符合您要求的是快速删除…

Java标准库中没有这样的容器

当我需要具有这些属性的数据结构时,我使用
列表
实现(通常是
数组列表
,但这并不重要),我使用


如果我必须将排序列表封装为可重用类,我将实现list接口,将所有方法委托给“标准”列表实现(它甚至可以作为参数传递给构造函数)。我会通过抛出一个异常(
UnsupportedOperationException
)来实现每个插入方法(add、addAll、set、迭代器的remove),这样就没有人可以破坏“总是排序”属性。最后,我将提供一个方法
insertSorted
,该方法将使用
Collections.binarySearch
进行插入。

我无法获取/删除优先级队列中的第n个元素。只有第一个elementArrayList-元素没有排序。TreeSet-无法获取/删除第n个元素(只有在我有键的情况下才能获取/删除元素)是的,我知道,但可以对其进行排序,例如,如果集合已填满,并且不再更新。列表只是一个接口,请提出一个实现。@Michael:谢谢。我指的是订购单。更正。扩展特定集合实现很少是个好主意。尤其是当您尝试强制执行新契约时(在您的情况下,add方法可能会破坏排序)。查看
Properties
类,了解一个关于不做什么的好例子!从ArrayList中删除是一个O(n)操作。我没有更好的想法,但我认为应该指出。@barjak,这是一个很好的观点。例如,可以重写这些方法并抛出一个UnsupportedOperationException。尽管如此,我还是不明白为什么从头开始实现列表接口会更好,仅仅因为…@user852631,这一点很好。还应注意,
insertSorted
也在O(n)中,而它可能通过使用不同的数据结构在O(logn)中实现。因为没有理由绑定到
ArrayList
。例如,如果您想要一个带有“iterator never fails”属性的
SortedList
,那么您的解决方案将无法重用。您必须重做相同的工作,但这次扩展的是
CopyOnWriteArrayList
,而不是
ArrayList
。如果您在这里使用组合而不是继承,那么您可以使用您想要的任何实现后端(例如,在实例化时)。这是
Properties
类的错误:它扩展了几乎不受欢迎的
哈希表
类,这个事实不能再改变了。另一个数据结构是可索引搜索树。一个简单的例子是二叉搜索树,它也在每个节点上存储该大小的子树。