2016-09-20 7 views
-1

나는 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

짧은 답변 : '새로운 ArrayList를 > (와

당신은 adj의 요소로 목록의 깊은 복사본을 생성하는 방법, 즉 사본 각 목록 요소를 확인해야합니다 current);'새로운 "outer"ArrayList 만 생성하면 내부 ArrayList는 이전과 동일하므로'current'리스트와 정확히 같은 항목을 포함합니다. 구글 딥 클론 대 얕은 복제. 딥 복제는 여기서 필요한 것입니다. – Munchhausen

답변

3

이 줄

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

adj 요소를 추가/제거되지만 current에 반영되지 않은 것을 의미 목록의 얕은 복사본을 생성 요소 자체를 변경하면 두 목록의 요소에 영향을 미칩니다.

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; 
}