簡體   English   中英

如何將一個數組列表深復制到另一個

[英]how to deep copy one arraylist into another

我第一次嘗試一些Java。 我嘗試創建arraylist的arraylist,並想將一個arraylist深度復制到另一個arraylist。 當執行以下代碼時,我得到錯誤:

import java.util.ArrayList;
import java.util.Scanner;
public class MyClass {
    public static void main(String args[]) {
        Scanner sc=new Scanner(System.in);
        ArrayList<ArrayList<Integer>> arrli = new ArrayList<ArrayList<Integer>>();
        System.out.println("Enter the array size: ");
        int n = sc.nextInt();
        int arr[] = new int[n];
        System.out.println("Enter "+ n + " elements: ");
        for(int i=0; i<n; i++) {
            arr[i] = sc.nextInt();
        }
        ArrayList<Integer> arrli1 = new ArrayList<Integer>();
        for(int i=0; i<n; i++) {
            if(i==0) {
                arrli1.add(arr[i]);
            } else if(arr[i] > arr[i-1]) {
                arrli1.add(arr[i]);
            } else if(arr[i] < arr[i-1]) {
                arrli.add(arrli1.clone());
                arrli1.clear();
                arrli1.add(arr[i]);
            }
            if(i==(n-1)) {
                arrli.add(arrli1);
            }
        }
        int s = arrli.size();
        int inner_size;
        for(int i=0; i<s; i++) {
            inner_size = arrli.get(i).size();
            for(int j=0; j<inner_size; j++){
                System.out.print(arrli.get(i).get(j));
            }
            System.out.println();
        }
    }
}

輸出:

/MyClass.java:21: error: no suitable method found for add(Object)
                arrli.add(arrli1.clone());
                     ^
    method Collection.add(ArrayList<Integer>) is not applicable
      (argument mismatch; Object cannot be converted to ArrayList<Integer>)
    method List.add(ArrayList<Integer>) is not applicable
      (argument mismatch; Object cannot be converted to ArrayList<Integer>)
    method AbstractCollection.add(ArrayList<Integer>) is not applicable
      (argument mismatch; Object cannot be converted to ArrayList<Integer>)
    method AbstractList.add(ArrayList<Integer>) is not applicable
      (argument mismatch; Object cannot be converted to ArrayList<Integer>)
    method ArrayList.add(ArrayList<Integer>) is not applicable
      (argument mismatch; Object cannot be converted to ArrayList<Integer>)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error

我在這里想念什么。 請對此有所說明。

正如我在對問題的評論中提到的那樣, clone()方法返回一個Object,並且由於編譯器只能看到並知道這一點,因此您必須(危險地)將返回的對象強制轉換為ArrayList,以使該方法起作用:

arrli.add((ArrayList<Integer>) arrli1.clone());

話雖如此,我懇請您在這種情況下不要使用clone() ,並且您閱讀了為什么人們如此害怕使用clone()(在collection和JDK類上)? 看看為什么。

如果這是我的代碼,我將 for循環中創建新的ArrayLists對象,而不是克隆現有的對象。 我不確定您要在此處實現什么目標,但我不確定100%,但可能與以下內容類似:

// list to hold other lists
List<List<Integer>> listOfLists = new ArrayList<>();

// inner list to be added to above list
List<Integer> innerList = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {  

    // if we need to create a new inner list, add old to 
    // list of lists and create new one          
    if (i != 0 && arr[i] < arr[i - 1]) {
        listOfLists.add(innerList);
        innerList = new ArrayList<>();
    }

    // always add to the current inner list
    innerList.add(arr[i]);
}

// when all is done, add last inner list to list of lists
listOfLists.add(innerList);

上面的代碼看起來更干凈更安全。 另外,如果您想知道為什么要使用:

List<Integer> foo = new ArrayList<>();

而不是

ArrayList<Integer> foo = new ArrayList<>();

請檢查:

不要使用clone()復制ArrayList 使用復制構造函數。

制作ArrayList<ArrayList<Integer>>的深層副本實際上非常簡單:

ArrayList<ArrayList<Integer>> arrli = /*...*/

// Create deep copy (no need to copy immutable Integer objects)
ArrayList<ArrayList<Integer>> copy = new ArrayList<>(arrli.size());
for (ArrayList<Integer> sublist : arrli)
    copy.add(new ArrayList<>(sublist));

該代碼當然假定沒有null列表。

.clone()返回一個對象,因此您必須將其轉換為適當的類型。 在你的情況下ArrayList<Integer>

暫無
暫無

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

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