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