ArrayList通过更改其副本进行更改

时间:2016-09-20 17:53:39

标签: java arraylist

我正在编写一个代码,需要复制一个arraylist但是我在调​​试后得到了错误的答案我发现更改arraylist的副本正在改变原来的arraylist但是我无法弄清楚为什么

static void iterDeep(int level,ArrayList<ArrayList<Integer>> current){

    if(current.equals(dest)){
        found = 1;
        printPath(current);
        return;
    }


    if(level <= 0)
        return;

    for(int i=0;i<3;i++){

        for(int j=0;j<2;j++){
                ArrayList<ArrayList<Integer>> adj = new ArrayList<ArrayList<Integer>>(current);
                if(j == 0){
                    for(int k=0;k<3;k++){

                        adj.get(k).set(i , current.get( (3+k-1)%3 ).get(i));

 // Here i am changing adj values but values in current are getting changed  

                    }
                    if(!map.containsKey(adj)){
                        map.put(adj,current);
                        iterDeep(level - 1 , adj);
                    }

                }else{
                    for(int k=0;k<3;k++){
                        adj.get(k).set(i , current.get( (k+1)%3 ).get(i));
                    }
                    if(!map.containsKey(adj)){
                        map.put(adj,current);   
                        iterDeep(level - 1 , adj);
                    }
                }

        }
    }

    return;
}

1 个答案:

答案 0 :(得分:3)

这一行

ArrayList<ArrayList<Integer>> adj = new ArrayList<ArrayList<Integer>>(current);

生成列表的副本,这意味着虽然添加/删除adj的元素未反映在current中,但更改元素本身会对{{ArrayList<Integer>产生影响。 1}}两个列表的元素。

您需要创建一个方法来创建列表的副本,即将每个单独的列表元素复制到adj的元素中:

static ArrayList<ArrayList<Integer>> deepCopy(ArrayList<ArrayList<Integer>> orig) {
    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
    for (ArrayList<Integer> inner : orig) {
        res.add(new ArrayList<Integer>(inner));
    }
    return res;
}