[英]adding an ArrayList to ArrayList
從概念上講,這是怎么回事?
我有一個ArrayList
ArrayList<SomeClass> myArray = new ArrayList<SomeClass>();
然后我像這樣添加一些東西
myArray.add(new myArray(1, 2, 3));
我有一個數組
ArrayList myArray = new ArrayList();
不,您沒有數組。 使用brackes []
聲明數組,如下所示:
int[] myArray;
您有一個ArrayList
類的對象。 該對象將在內部使用一個數組來存儲數據,並在需要分配更多值時動態地將該數組更改為更新的數組。
然后我像這樣添加一些東西
myArray.add(new myArray(1, 2, 3));
從概念上講,這是錯誤的,甚至無法編譯。 如果要在數組中添加多個值,則應使用ArrayList#addAll
方法,該方法將接收另一個集合。 然后,您可以通過兩種方式在一個語句中傳遞Collection
:
使用Arrays#asList
創建一個列表:
myArray.addAll(Arrays.asList(1, 2, 3));
您可以使用雙括號初始化:
myArray.addAll(new ArrayList() {{ add(1); add(2); add(3); }});
您應考慮到應為ArrayList
指定通用名稱,而不要使用原始數據:
ArrayList<Integer> myArray = new ArrayList<Integer>();
myArray.addAll(new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
}});
更多信息:
請注意,如果您有一個與自定義類綁定的ArrayList
,比如說ArrayList<SomeClass> myArrayList
,那么編譯器將阻止您將未通過IS-A測試的元素添加到列表中( instanceof
運算符表示) ,因此這段代碼:
ArrayList<SomeClass> myArrayList = new ArrayList<SomeClass>();
myArrayList..addAll(new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
}});
由於Integer
不是SomeClass
因此無法編譯。 與這段代碼類似:
ArrayList<SomeClass> myArrayList = new ArrayList<SomeClass>();
myArray.add(Arrays.asList(1, 2, 3));
但是由於類型擦除,您可以使用原始類型來欺騙編譯器。 例如:
public void addData(ArrayList yourArrayList, Object anyData) {
yourArrayList.add(anyData);
}
然后在您的代碼中,調用此方法:
ArrayList<String> myArrayList = new ArrayList<String>(); //allows Strings only
myArrayList.add("Hello world");
//myArrayList.add(0); //this won't compile because trying to add an Integer
addData(myArrayList, 0); //this will compile for using raw ArrayList and sending an Integer
System.out.println(myArrayList);
它將打印:
[Hello world, 0]
myArray.add(new myArray(1, 2, 3));
這是不正確的並且不能編譯,因為myArray
不是類型,它只是一個引用,您需要某種類型為integer的東西,或者如果您想添加另一個列表,請使用addAll
。
您可以使用類似這樣的東西。
List<Integer> myArray = new ArrayList<>(); // specify with generics type parameter
//do some things and then
myArray.addAll(Arrays.asList(1,2,3)); // use this helper method to add a list to another list
或者,如果您只想創建和填充它,只需使用
List<Integer> myArray = Arrays.asList(1,2,3,4,5);
我想我知道您要做什么,說您有這個。
ArrayList<Integer[]> myArray = new ArrayList<Integer[]>();
並且您想要向其中添加一個數組,基本上您將要調用
myArray.add(((Integer[]) new int[] { 0, 1, 2 }));
它將把數組[0,1,2]添加到ArrayList中的下一個索引。
例如,以下代碼
ArrayList<Integer[]> myArray = new ArrayList<Integer[]>();
myArray.add(((Integer[]) new int[] { 0, 1, 2 }));
myArray.add(((Integer[]) new int[] { 1, 0, 2 }));
myArray.add(((Integer[]) new int[] { 3, 2, 1 }));
將創建以下結果:
myArray index 0 = [0, 1, 2]
myArray index 1 = [1, 0, 2]
myArray index 2 = [3, 2, 1]
這是你的問題嗎?
您實際上沒有數組,但是有ArrayList。 ArrayList是List接口的可調整大小的實現。 這意味着,除其他外,您不必像使用數組那樣定義長度。
我認為您提供的代碼實際上不會編譯,因為當您進行以下操作時:
myArray.add(new myArray(1, 2, 3));
您尚未提供類型。 您應該執行以下操作:
myArray.add(new ArrayList<Integer>(Arrays.asList(1,2,3)));
使用asList()幾乎等同於為數組分配“默認”值。 等效數組看起來像這樣:
Integer[] intArray = new Integer[] {1,2,3};
您還應該參數化ArrayList
,這基本上意味着您在說ArrayList可以容納的內容。 例如:
ArrayList<Integer>
可以容納整數。
之所以必須使用包裝類( Integer
&not int
)是因為Java中的Collections不允許您存儲基本類型,如int
或double
。
您可以擁有一個包含另一個收藏夾的收藏夾。 在這種情況下,您可以:
ArrayList<ArrayList<Integer>> myArrayList = new ArrayList<ArrayList<Integer>>();
myArrayList.add(new ArrayList<Integer>(Arrays.asList(1, 2, 3)));
myArrayList.add(new ArrayList<Integer>(Arrays.asList(9, 12, 24)));
for (ArrayList<Integer> index : myArrayList) {
System.out.println(index);
}
在這里,您有一個包含其他兩個ArrayList的ArrayList。 這導致打印:
[1, 2, 3]
[9, 12, 24]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.