簡體   English   中英

添加通用類型的元素 <T> 到LinkedList的arrayList

[英]Adding a element of Generic type <T> to an arrayList of LinkedList's

我想在Java中創建一個哈希表類,在其中將鍵值對存儲在鏈表的ArrayList中。 我通過聲明來做到這一點

 ArrayList<LinkedList<T>> storage = new ArrayList();

然后,我想創建一個linkList對象,該對象可用於在arrayList的每個索引內創建一個新的鏈表。 我通過聲明:

  LinkedList<T> list = new LinkedList<T>();

然后設置我的add函數,將元素添加到arrayed的Hashed鍵索引內的LinkedList的第一個索引中,如下所示:

public void add(K key, T value){    
int arrayListIndex = (key.hashCode()) % this.initialCapacity;
    System.out.println(arrayListIndex); //This tells us where we access the Array List;


    if (hashBrown.get(arrayListIndex) == null){

        hashBrown.add(arrayListIndex, list);
        hashBrown.get(arrayListIndex).addFirst(value);
    }
}

每次運行此代碼時,我都會收到一個錯誤,索引為7,大小為0。這將導致錯誤:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:571)
    at java.util.ArrayList.get(ArrayList.java:349)
    at FastHashtable.add(FastHashtable.java:72)
    at FastHashtable.main(FastHashtable.java:145)

我無法找到該索引超出范圍錯誤的出處,任何人都可以提供建議。 我在使用ArrayLists時是相當陌生的,這使我認為arrayList的原始聲明不正確。

您正在將ArrayList容量與其大小混淆。 從Oracle Java文檔中:

每個ArrayList實例都有一個容量 容量是用於在列表中存儲元素的數組的大小。 它總是至少與列表大小一樣大。 將元素添加到ArrayList ,其容量會自動增長。 除了添加元素具有固定的攤銷時間成本外,沒有指定增長策略的詳細信息。

相反,您應該考慮創建一個普通數組(例如Object[] a = new Object[maxSize] ),在其中您可以實際為任意索引值分配對象(在這種情況下為鏈接列表)。 如果只想存儲鏈接列表,請創建一個LinkedList<T>[]數組。

如果其中有0個元素,則不能將其添加到索引7的列表中。 您只能在末尾添加(使用不帶索引的add方法)或在不大於當前列表的size()

當列表為空並且在索引7處添加內容時,您期望列表在第一位置包含什么,在索引6處包含什么? (我曾經創建過一個list的子類,當附加索引大於列表的大小時,它會使用null填充索引中的所有內容,但是這種行為並不通用,不足以成為List語義的一部分。


[編輯以回應此處的評論和praseodym的回答]

您可以簡單地用空值填充(數組)列表,而在首次訪問相應位置時,將其替換為鏈接列表。 (不過,請確保使用set而不是add ,這可能也是您上面想要的。)或者,您可以創建所需大小的數組(默認情況下將充滿null )並將其“包裝”通過Arrays.asList放入一個(不可調整大小的)列表。 但是,您必須忽略“未經檢查的轉換”警告(但是,並不是在使用數組時可以避免出現警告)。 另外,我建議您閱讀“ 編程到接口,而不是實現 ”。

暫無
暫無

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

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