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

10-06 13:45