我正在编写一个代码,需要复制一个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;
}
答案 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;
}