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

时间:2010-11-22 18:54:05

标签: java data-structures collections sortedlist

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

  • 元素数量(理论上)无界限。
  • 元素按升序排序。
  • 您可以获得第n个元素(快速)。
  • 您可以删除第n个元素(快速)。

我希望找到一个可索引的跳过列表,但我没有。他们是否有任何符合我所述要求的数据结构?

7 个答案:

答案 0 :(得分:5)

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

当我需要具有这些属性的数据结构时,我使用List实现(通常为ArrayList,但无关紧要),并使用{{3}执行所有插入操作}。

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

答案 1 :(得分:3)

没有符合您所有标准的简单数据结构。

我所知道的唯一能够满足它们的是indexable skip list。 Hoewever,我不知道任何现成的Java实现。

答案 2 :(得分:2)

这个问题与

非常相似

查看my answer to that question

基本上它表明了以下内容:

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);
        }
    }
}

关于您的第一个要求的说明:“元素数量无限制。”:

您可能希望将此限制为“元素数量不应少于2 31 -1 ......”,否则您将排除所有选项由Java数组支持。 (你可以使用例如LinkedList来获取任意数量的元素,但我无法看到你如何在其中进行快速查找。)

答案 3 :(得分:1)

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

答案 4 :(得分:0)

ListCollections.sort()结合使用。

答案 5 :(得分:0)

使用List<T>Collections.sort()所述的dwb,您可以使用ArrayList<T>来实现List<T>(并且不会像Vector<T>那样同步,除非当然你想要那个开销)。这可能是你最好的选择,因为他们(Sun)通常会对这些领域进行大量研究(从我所见过的)。如果你需要按“默认”以外的其他东西排序(即你没有排序整数列表等),那么请提供你自己的比较器。

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

答案 6 :(得分:-1)

请看PriorityQueue

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