如何将一个数组列表深复制到另一个

时间:2018-08-02 16:51:36

标签: java arraylist

我是第一次尝试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

我在这里想念什么。请对此有所了解。

3 个答案:

答案 0 :(得分:1)

正如我在对问题的评论中提到的那样,clone()方法返回一个对象,并且由于编译器只能看到并知道这一点,因此您必须(危险地)强制转换该对象返回为ArrayList以使方法起作用:

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

话虽如此,我恳请您在这种情况下不要使用clone(),而您阅读Why people are so afraid of using clone() (on collection and JDK classes)?来了解原因。

如果这是我的代码,我会在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<>();

请签出:

答案 1 :(得分:1)

请勿使用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子列表。

答案 2 :(得分:0)

.clone()返回一个Object,因此您必须将其转换为正确的类型。就您而言,ArrayList<Integer>