2011-06-03 51 views
4

我需要實現一個2D動態數組。行數是固定的,比如說n。但是,每行的列數不是固定的,並且是等價的。例如,第一行有3個元素,第二行有5個元素。如何使用Arraylist在Java中執行此操作。謝謝。在Java中使用ArrayList的2D動態數組

+0

請問 - 在你的例子中 - 第一行總是有3個元素?如果是這樣,爲什麼不簡單地創建一個(例如)'Something [] [] s = new Something [numRows] []'和's [0] = new Something [3]'? – Tedil 2011-06-03 20:30:03

回答

3

List<List<Foo>>怎麼樣?

例如:

List<List<Foo>> list = new ArrayList<List<Foo>>(); 

List<Foo> row1 = new ArrayList<Foo>(); 
row1.add(new Foo()); 
row1.add(new Foo()); 
row1.add(new Foo()); 
list.add(row1); 

List<Foo> row2 = new ArrayList<Foo>(); 
row2.add(new Foo()); 
row2.add(new Foo()); 

list.add(row2); 
+0

list和ArrayList有什麼區別?爲什麼只是ArrayList > list = new ArrayList >(); 謝謝 – user288609 2011-06-03 20:48:26

+3

'List'是一個'interface','ArrayList'是它的具體實現。那麼如果你有'List ',那麼你可以參考'LinkedList'或者其他一些實現 – 2011-06-03 20:56:04

2
ArrayList<ArrayList<SomeObject>> twodlist = new ArrayList<ArrayList<SomeObject>>(); 
ArrayList<SomeObject> row = new ArrayList<SomeObject>(); 
row.add(new SomeObject(/* whatever */)); 
// etc 
twodlist.add(row); 
row = new ArrayList<SomeObject>(); 
// etc 
+2

幾乎,除了'2dlist'不是一個有效的Java標識符。 :) – 2011-06-03 20:28:04

+0

@Ted Hopp,哪裏可以看到該標識符? ;-)感謝您的更正:-) – MarioP 2011-06-03 20:33:18

1

嘗試:

ArrayList<ArrayList<DataType>> array = new ArrayList<ArrayList<DataType>>(); 
for (int i = 0; i < n; ++i) { 
    array.add(new ArrayList<DataType>()); 
} 
+1

你不能混合使用數組和泛型。 – trutheality 2011-06-03 20:29:28

+0

Ack。修正答案。 – 2011-06-03 20:30:59

+0

更正:你可以用'@SuppressWarnings(「unchecked」)''去掉,但你不鼓勵。 – trutheality 2011-06-03 20:37:55

0

如你說,可以使的ArrayLists的陣列,並且使用該ArrayList(INT初始容量)構造設置每列的容量:

ArrayList<YourObject>[] rows=new ArrayList<YourObjects>[n]; 
for(i=0;i<n;i++){ 
rows[i]=ArrayList<YourObjects>(initialsize); 
} 
+1

「ArrayList是一種原始類型,對泛型類型ArrayList 的引用應該被參數化」 - 錯誤的編碼風格。 'ClassCastException'的高風險。 – MarioP 2011-06-03 20:36:29

+0

良好的捕捉 - 感謝您的更正!上面的代碼已被修復。 – CodeRedd 2011-06-04 02:50:04

+0

現在它不會編譯^^ – MarioP 2011-06-04 10:44:12

0

您可以創建一個ArrayList元素數組,因爲您的行數是固定的。

ArrayList[] dynamicArray = new ArrayList[n](); 

注意:您需要在數組中的每個條目中分配一個ArrayList對象。所以......

for (int loop = 0; loop < n; loop++) 
dynamicArray[loop] = new ArrayList(); 

或者如果你想行和列是動態的,你可以創建的ArrayList的ArrayList ....

ArrayList<ArrayList<T>> dynamicArray = new ArrayList<ArrayList<T>>(); 

再次,你需要在dynamicArray的每個新條目中創建一個數組列表。

0

如果行的數量是固定的,嘗試這樣的事情:

ArrayList<MyObject>[] = new ArrayList<MyObject>[fixedRows] 
+0

被java編譯器禁止。你不能創建一個通用數組。 – MarioP 2011-06-03 20:39:55

+0

需要'@SuppressWarnings(「unchecked」)才能始終工作。 – trutheality 2011-06-03 20:40:40

+0

該死的Java泛型...然後'ArrayList [] = new ArrayList [fixedRows]'。吸它Java。 – erickzetta 2011-06-03 20:45:06

2

您可以使用該行的陣列,因爲這dimenstion是固定的:

@SuppressWarnings("unchecked") 
ArrayList<T>[] arr = new ArrayList[ fixedsize]; 

或使用嵌套的ArrayList :

List<List<T>> list = new ArrayList<List<T>>(fixedsize); 
+0

被java編譯器禁止。你不能創建一個通用數組。 – MarioP 2011-06-03 20:42:42

+0

不要禁止!你可以很好地創建參數化類型的數組,你可以測試我的代碼。它按預期進行編譯和工作。 – x4u 2011-06-03 20:46:30

+0

好吧,我無法做到。 %@§$我做錯了什麼? o.O – MarioP 2011-06-03 20:57:40

0
List<ArrayList<SomeObject>> twoDList = new ArrayList<List<SomeObject>>(n); 
for(int i=0; i<n; i++) 
    twoDList.add(new ArrayList<SomeObject>()); 

使用如:

twoDList.get(rownumber).add(newElementInColumn); 
0

我想創建的ArrayList的陣列(ArrayList的[3]的行=新的ArrayList [3]如果行是3)然後,對於每個行創建列的類和它們插入到一個ArrayList。然後將ArrayList放入數組中。行數組的索引可用於跟蹤行數。記得數組的起始索引爲0,因此行號將是行[index + 1]