簡體   English   中英

將ArrayList添加到ArrayList

[英]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

  1. 使用Arrays#asList創建一個列表:

     myArray.addAll(Arrays.asList(1, 2, 3)); 
  2. 您可以使用雙括號初始化:

     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不允許您存儲基本類型,如intdouble

您可以擁有一個包含另一個收藏夾的收藏夾。 在這種情況下,您可以:

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.

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