我正在尝试遍历listname1中的所有元素(包含2d数组的列表),同时将它们存储在2D数组中。但是,我不认为该阵列正在更新。我认为问题是我得到了一个深层拷贝,但我正在尝试创建一个新实例并使用克隆但它无法正常工作。
public class MainMap implements Cloneable {
List listname1;
@Override
public Object clone() {
MainMap m = new MainMap();
m.listname1 = this.listname1;
return m;
}
public static void main(String[] args) {
// listname1 is a variable from a different class so I couldn't
// listname1 is a list containing multiple 2d arrays
// array is a 2d array
listname1 = classname.method(foo);
for (int i = 0; i < listname1.size(); i++) {
List <int [][]> listname2 = new ArrayList <int [][]>(listname1.clone());
int [][] array = (int [][]) listname2.get(i).clone();
// ...
}
// ...
}
}
listname1在另一个类中定义,如果这些名称令人困惑,很抱歉。有效地,该方法所做的是使给定列表的不同编队然后返回它。此方法还成功使用克隆来获得浅拷贝。
public List listName1(List randomlist, int [] array1, int [][] 2DArray, int [][] prev2DArray)
{
int x = array1[0] - 1;
int y = array1[1] - 1;
List listName1 = new ArrayList();
for (int i=0; i<3;i++)
{
for(int j=0; j<3;j++)
{
if (neighbourNodes.contains(2DArray[i][j]))
{
int temp = 2DArray[i][j];
int temp2 = 2DArray[x][y];
2DArray[i][j] = temp2;
2DArray[x][y] = temp;//
int[][] cloned2DArray = new int[2DArray[0].length][2DArray[1].length];
for (int t = 0; t < 2DArray.length; t++) {
cloned2DArray[t] = 2DArray[t].clone();
}
if (!(old2Darray== cloned2DArray))
{
listName1.add(cloned2DArray);
}
2DArray[i][j] = temp;
2DArray[x][y] = temp2;
}
}
}
答案 0 :(得分:0)
要进行深度克隆,您需要在克隆方法中创建一个全新的listname1:
public Object clone() {
MainMap m = new MainMap();
// NOTE: these values passed to the listname1 method need
// to be initialized somewhere else in the code.
m.listname1 = this.listname1(randomlist, array1, 2DArray, prev2DArray);
return m;
}
不是将m.listname1指定为指向列表名的现有副本的内存地址,而是使用您想要的任何起始值在内存中初始化一个全新的副本。我认为这解决了你想要做的事情,但如果没有,请告诉我。请注意,这里的关键区别在于您在内存中创建一个全新的对象,而不是仅仅指向一个基本上在所有克隆之间共享的现有副本。因此,如果一个克隆更改了该共同对象,则更改将反映在所有克隆副本中。按照我的建议进行操作将创建彼此独立的副本。