2017-08-11 4 views
1

Also, wenn ich eine Arraylist A in einem Arraylist-Konstruktor einfügen ich ein neues Arraylist-Objekt B mit dem gleichen Satz von Objekten wie A. In meinem Fall habe ichArraylist Konstruktor Erstellen keine neuen Objektverweis

Arraylist<Arraylist<Integer>> powerSet 
Arraylist<Arraylist<Integer>> OG 

erstellt erwarten sowohl Powerset und OG scheinen die gleichen Bezugs zu teilen trotz OG von Powerset wie folgt aufgebaut ist:

ArrayList<ArrayList<Integer>> OG = new ArrayList<>(powerSet); 

Hier wird der vollständige Code ist:

public static ArrayList<ArrayList<Integer>> generatePower (ArrayList<Integer> s){ 
    ArrayList<ArrayList<Integer>> powerSet = new ArrayList<>(); 
    generatePower(s,powerSet); 
    return powerSet; 
} 
public static void generatePower(ArrayList<Integer> s,ArrayList<ArrayList<Integer>> powerSet){ 
    if(s.size()==0){ 
     powerSet.add(s); 
     return; 
    } 
    else{ 
     int temp = s.remove(0); 
     generatePower(s,powerSet); 
     ArrayList<ArrayList<Integer>> OG = new ArrayList<>(powerSet); 
     for(ArrayList<Integer> el: OG){ 
      el.add(temp); //for some reason any changes I make to OG here is 
         //reflected in the powerSet 
     } 
     powerSet.addAll(OG); 

    } 
} 

Warum OG und Powerset haben die gleiche Referenz und wie mache ich OG ein neues Arraylist ohne haben Anteil alle Powerset der Elemente OG sein, die Powerset Referenz der

Antwort

0

ArrayList<ArrayList<Integer>> OG = new ArrayList<>(powerSet);

diese Linie passieren alle Elemente (Kopie Referenzen) gespeichert in powerSet zu OG.

Es ist Arbeit in der gleichen Art und Weise wie Beispiel:

List<User> usersList_1 = Arrays.asList(user1, user2, user3); 
List<User> usersList_2 = new ArrayList(userList_1); 

user1.setName("John"); 

userList_2.get(0).getName(); 

Ausgang: John

1

Der ArrayList Konstruktor keine Elemente klonen; Es kopiert nur Referenzen. Hier ist eine Möglichkeit, eine tiefe Kopie mit Streams

List<List<Integer>> copy = powerSet.stream() 
     .map(ArrayList::new) 
     .collect(Collectors.toList()); 
zu machen
Verwandte Themen