簡體   English   中英

java中的動態數組聲明

[英]Dynamic array declaration in java

任何人都可以告訴我這個java聲明中的錯誤String[][] t=new String[15][15]; 這工作正常,如果我使用String[][] t=new String[][]; 因為我需要將變量t聲明為動態,因為我不確定我將在t中存儲多少值。

使用ArrayList(或可以處理任意數量對象的其他數組對象)。 java數組始終具有固定長度,因為將為該數組保留一些內存。

ArrayList也創建了這樣的數組來存儲對象。 你添加更多的abjects作為數組的當前保留大小比ArrayList將創建一個新的更大的數組(如果我是正確的話,+ 50%)。 還有一些其他實現有點不同(例如,當陣列已滿時,它們會創建一個新陣列100%的原始陣列。如果性能對您來說非常重要,那么您可以查看它。

ArrayList<ArrayList<String> t = new ArrayList<ArrayList<String>();

void fill() {
    ArrayList<String> t2 = new ArrayList<String>();
    t2.add("somestring");
    String s = "someotherstring";
    t2.add(s);
    t.add(t2);
}

如果您不知道需要多大才能將其聲明為

String[][] t;

一旦你知道它需要多大,你可以做( 嘗試使用數組之前)

t = new String[15][15];

如果你不確定數組需要多大,你需要使用像List of Lists這樣的東西。

List<List<String>> t = new ArrayList<List<String>>;

public void add(String str, int row, int col) {
    while (row >= t.size())
        t.add(new ArrayList<String>());

    List<String> row_list = t.get(row);
    while (col >= row_list.size())
        row_list.add("");

    row_list.set(col, str);
}

在Java中,數組對象始終具有固定長度。 一旦分配了它們,就無法改變它們的大小。 可以使數組變量指向不同大小的不同數組對象。 所以你可以分配:

String[][] t;

一旦知道大小,它就不會指向一個對象並分配一個對象:

int n1,n2;
// calculate n1,n2
t = new String[n1][n2];

如果你需要一個可以改變大小的結構,你最好使用ArrayList,它可以動態調整大小。

將其聲明為String [][]t = null;

一旦你得到它,並用實際長度 重新初始化它。

t=new String[x][y];

矢量也可以增長:

Vector<Vector<String>> t = new Vector<Vector<String>>();

然后調用Add方法將項添加到向量。

正如bemace所說,僅僅因為你聲明變量並不意味着你必須立即初始化它。

正如馬克所說,陣列具有固定的大小。 一旦數組被初始化 (未聲明,初始化),它就具有固定的大小。

所以,有兩種可能性:

您需要知道在需要開始使用它之前需要多大的數組,在這種情況下,您可以按照bemace的建議簡單地延遲初始化。

或者在開始使用它之前你不知道它需要多大,在這種情況下你需要使用動態大小的數據結構。 查看Java Collections API:

教程 api參考

已經有幾個好的答案,但現在已經在Mark Ba​​ijens的回答中透露,這個問題的目的是raju需要多值映射的關鍵

Mark通過建議raju使用HashMap<String, String> hashMap = new HashMap<String, String>();跟蹤該評論HashMap<String, String> hashMap = new HashMap<String, String>(); - 但是這僅適用於單個鍵值對。

raju需要的是一個

Map<String, Collection<String>> t
    = new HashMap<String, List<String>>();

添加密鑰的第一個值需要為該存儲桶初始化List,而添加其他值則需要獲取現有列表並添加新值。

注意我在聲明中使用了Collection<String> ,因此如果值的順序很重要,它可以是List,也可以是Set,以防止在同一個鍵下重復值。

這可能最好是作為一個類本身實現的

public class MultiValueMap<K, V> extends Map<K, V>
{
    ...
}

因此,可以在實現中隱藏第一個put(key, value)和后續.add(value)列表的初始化。

暫無
暫無

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

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