繁体   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