2017-08-15 22 views
0

我想知道如何初始化具有無限量預定義值的ArrayList,以便可以訪問任意索引的元素並更新其值。帶有無限預定義值的ArrayList

例如,ArrayList的testArrayList將與所有int價值0開始,我可以立即使用testArrayList.set(123, 15)在ArrayList中的124元素設置爲15,而不是得到一個出界異常的。當我執行像testArrayList.get(99999)這樣的查詢時,我會得到預定義的值0

我一直在嘗試初始化ArrayList,然後使用for循環向它添加0 s,但我必須決定初始ArrayList應該有多大。如果我創建了一個ArrayList,然後立即添加100 0 s,那麼在添加另一個0 s之前,我無法對其執行.get(200)

是我正在尋找可能與ArrayList?如果不是,你會推薦一些替代解決方案嗎?

謝謝。

編輯:我想要一個列表的原因是我希望能夠按順序遍歷它。我正在製作一個簡單的日曆式程序,我可以在其中添加/檢索/修改任意「日期」的「筆記」,但也可以打印出特定時間段內每個「日」的筆記。

+1

也許你可以描述你試圖解決的問題,這個問題促使你問這個問題。 –

+0

爲什麼你需要一個有無限預定義值的列表? – hamena314

+2

實現您自己的ArrayList,並將您的需求添加到方法 – azro

回答

1

它聽起來不像ArrayList(或任何種類的List)是真的想要你想要的。這聽起來像你想要一個Map

但是,如果你想把它當作一個ArrayList,你可以繼承它,並覆蓋getset這樣他們檢查列表是否是該指數足夠大,如果沒有,就補到這是一點。

鬆散,爲set

@Override 
public E set(int index, E element) { 
    if (this.size() <= index) { 
     this.ensureCapacity(index + 1); 
     for (int n = this.size(); n <= index; ++n) { 
      this.set(n, 0); 
     } 
    } 
    return super.set(index, element); 
} 

,再次,它似乎是一個Map可能是一個更好的選擇。

4

你不想爲了填充99999「個索引創建ArrayList,因爲你必須0填充指數以99998首先,這是一種浪費。

A HashMap<Integer,Integer>是一個更好的選擇,因爲您只填充您關心的索引。

A HashMapInteger鍵可以被認爲就好像您將您的「稀疏ArrayList」的索引映射到一個小數組中,這可以減少存儲需求,同時保持預期的插入和查找時間不變。

例如:

Map<Integer,Integer> map = new HashMap<>(); 
int value = map.getOrDefault(99999,0); // this will return 0 if the Map has no value 
             // for the key 99999 
map.put (99999, value + 1); 

編輯:看到你的迭代順序的要求,你可以使用TreeMap<Integer,Integer>代替HashMap<Integer,Integer>。這種方式遍歷鍵將始終按照它們的數字順序進行迭代。

+0

謝謝,我將嘗試使用TreeMap。 – gcarol

0

您正在問如何填補一個人口稀少的數組。

據我所知,Java內置庫中沒有這樣的東西。

選項空間:

  • 使用的另一種數據結構,即更適合「稀疏」的內容。有123個空插槽有什麼意義?當你只有一個真正的內容插槽......一個地圖可能更適合你的需求。
  • 你總是可以實現自己的清單版本,其中「創建」所有這些空槽點播
0

躲在一個自定義的方法訪問列表。如果列表中沒有足夠的項目,請在列表中添加默認項目,直到達到所需的索引爲止。如果下一個索引小於或等於該大小,則獲取該索引。否則重複。

沒有無限的默認值的默認結構(它不會非常有效)。通過隱藏如上所述的列表,您只需要儘可能多的項目(或按照您的需要)。