我试图遍历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;
}
}
}
最佳答案
要进行深度克隆,您需要在克隆方法中创建一个全新的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指向现有列表名称副本的内存地址,而是使用所需的任何起始值初始化内存中的全新副本。我认为这可以解决您想要做的事情,但如果不能解决,请告诉我。请注意,这里的主要区别是您要在内存中创建一个全新的对象,而不仅仅是指向实际上在所有克隆之间共享的现有副本。因此,如果一个克隆更改了该共同对象,那么更改将反映在所有克隆副本中。按照我的建议进行操作将创建彼此独立的副本。