Ich habe ein Programm geschrieben, um alle möglichen Teilmengen eines bestimmten Arrays zu berechnen.Korrekte Verwendung von Java-Liste Objekt
class Solution {
/**
* @param S: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
// write your code here
if(nums == null) return null;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
helper(res, list, nums, 0);
return res;
}
private void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> list, int [] nums, int start) {
//res.add(list);
res.add(new ArrayList<Integer>(list));
//System.out.println(list);
for(int i = start; i < nums.length; i++) {
list.add(nums[i]);
//System.out.println(list);
helper(res, list, nums, i+1);
list.remove(list.size()-1);
}
}
}
Das Programm funktioniert gut. Allerdings, wenn ich verwenden
res.add(list);
statt
res.add(new ArrayList<Integer>(list));
Dann wird es das falsche Ergebnis. Zum Beispiel, wenn ich diesen Eingang gebe
int [] nums = new int[]{0};
Die erwartete Ausgabe ist [[], [0]]. Ich bekomme jedoch [[], []].
Fragen: 1.Weil ich versuche, das gleiche Objekt zu dem Objekt res hinzuzufügen. Ich nehme an, das res ArrayList-Objekt versucht zu überprüfen, ob das Listenobjekt bereits darin enthalten ist. Ist das richtig?
2.Warum bekomme ich [[], []]? Da das Listenobjekt in der Schleife auf [0] aktualisiert wird, warum wird es nicht zum res-Objekt hinzugefügt?
Verstehst du den Unterschied zwischen 'Liste' in' res' setzen und dann 'liste' ändern; und eine Kopie von "liste" in "res" und dann die ursprüngliche "liste" ändern? – khelwood
Ich denke, ich verstehe es. Nachdem ich die Liste zum zweiten Mal in res eingefügt habe, habe ich die list.remove() gemacht, so dass der zweite Zusatz jetzt auch leer ist. – drdot