2016-09-20 3 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 > (current); 'вы создаете только новый« внешний »ArrayList, внутренний ArrayList по-прежнему остается таким же, как и раньше, и содержит точно такие же элементы, что и в вашем« текущем »списке. Глубокий клон Google против мелкого клонирования. Глубокое клонирование - вот что вам нужно здесь. – Munchhausen

ответ

3

Эта линия

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

производит неглубокую копию списка, а это означает, что, хотя добавление/удаление элементов adj не отражаются в current , сами изменяющиеся элементы влияют на элементы ArrayList<Integer> обоих списков.

Вам нужно сделать метод, который создает глубокой копии списка, то есть копии каждый отдельный элемент списка в элементы 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; 
}