簡體   English   中英

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

[英]Is there an indexable sorted list in the Java.util package?

我正在尋找java.util包中的數據結構。 我需要它來滿足以下要求:

  • 元素的數量(理論上)是無界的。
  • 元素按升序排序。
  • 你可以獲得第n個元素(快速)。
  • 您可以刪除第n個元素(快速)。

我希望找到一個可索引的跳過列表,但我沒有。 他們是否有任何符合我所述要求的數據結構?

Java標准庫中沒有這樣的容器。

當我需要具有這些屬性的數據結構時,我使用List實現(通常是一個ArrayList ,但沒關系),我使用Collections.binarySearch進行所有插入。

如果我必須將排序列表封裝為可重用的類,我將實現List接口,將所有方法委托給“標准”List實現(它甚至可以作為參數傳遞給構造函數)。 我通過拋出異常( UnsupportedOperationException )來實現每個插入方法(add,addAll,set,Iterator的remove),這樣就沒有人可以破壞'always sorted'屬性。 最后,我提供了一個方法insertSorted ,它將使用Collections.binarySearch進行插入。

沒有簡單的數據結構可以滿足您的所有標准。

我所知道的唯一能夠滿足它們的是一個可索引的跳過列表 Hoewever,我不知道任何現成的Java實現。

這個問題非常相似

看看我對這個問題的回答

基本上它表明以下內容:

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來獲取任意數量的元素,但我無法看到你如何在其中進行快速查找。)

TreeSet為您提供自然排序功能,同時向列表中添加元素。 但是如果你不需要它,並且允許使用Collections.sort(),你可以使用簡單的ArrayList

考慮ListCollections.sort()結合。

使用List<T>Collections.sort()聲明的dwb,你可以使用ArrayList<T>實現List<T> (並且不像Vector<T>那樣同步,除非你想要那個開銷)。 這可能是你最好的選擇,因為他們(Sun)通常會對這些領域進行大量研究(從我所見過的)。 如果你需要按“默認”以外的其他東西排序(即你沒有排序整數列表等),那么請提供你自己的比較器。

編輯:唯一不符合您要求的是快速刪除...

看看PriorityQueue

如果您的數據結構中不需要類似的元素,那么通常的TreeSet也符合您的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM