2016-09-20 1 views
-1

Ich schreibe einen Code, der eine Arraylist kopieren muss, aber ich bekomme falsche Antwort nach dem Debuggen Ich fand, dass das Ändern einer Kopie von Arraylist die ursprüngliche Arraylist ändert, aber ich bin nicht in der Lage, herauszufinden, warumArrayList ändert sich durch Ändern der Kopie

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

Kurze Antwort: mit 'new Arraylist > (current); 'Sie erstellen nur eine neue" äußere "ArrayList, die innere ArrayList ist immer noch die gleiche wie zuvor und enthält somit genau dieselben Elemente wie in Ihrer' aktuellen' Liste. Google Deep Clone versus seichtes Klonen. Tiefes Klonen ist das, was Sie hier brauchen. – Munchhausen

Antwort

3

Diese Linie

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

erzeugt eine flache Kopie der Liste, was bedeutet, dass Elemente von adj obwohl das Hinzufügen/Entfernen nicht in current reflektiert sich ändernde Elemente selbst wirken sich auf ArrayList<Integer> Elemente beider Listen aus.

Sie benötigen eine Methode zu machen, die eine tief Kopie der Liste erstellt, dh Kopien jedes einzelne Listenelement in Elemente 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; 
} 
Verwandte Themen