将列表元素复制到2D数组

时间:2016-12-09 16:32:39

标签: java arrays list clone

我正在尝试遍历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;
            } 

        }
    }

1 个答案:

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