2016-09-21 4 views
-4

Ich möchte das lastElement von 2D-ArrayList genannt Punkt und das letzte Element zurück zur Liste als ein neues Element mit aktualisierten Y-Wert und gleichen X-Wert hinzufügen. Also im Grunde, was ich tue, ist das letzte Element des Punkt-2D-Arrays zu bekommen, füge es am Ende des Punkt-2D-Arrays hinzu, aber mit Änderung zu y-Wert dazu. Aber das Problem ist, dass wenn ich den y-Wert ändere, es auch den Wert des Elements ändert, von dem die Information genommen wurde.Warum verändert das Ändern des Werts eines Elements in einer ArrayList das der anderen?

List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values= new ArrayList<Integer>(); 
    values.add(1);//x 
    values.add(2);//y 

    point.add(values); 
    point.add(point.get(point.size()-1)); 
    point.get(0).set(1, 200); 
    System.out.println(point); 

Ausgang: [[1, 200], [1, 200]] Erwartete Ausgabe: [[1, 2], [1, 200]]

+1

Zeigen Sie uns den Code, zeigen Sie erwartete und aktuelle Ausgabe ... –

+1

Bitte klären Sie mehr. Zeigen Sie etwas Code. –

+0

http://stackoverflow.com/help/how-to-ask http://stackoverflow.com/help/mcve –

Antwort

0
point.add(point.get(point.size()-1)); 

nicht tun, was Sie denken. Es fügt eine reference zu dem zweitletzten Element in der Arraylist zum letzten hinzu. Wenn Sie also versuchen, den Wert des letzten Elements anzuzeigen, werden die Daten der vorletzten values in abgerufen und angezeigt. Um die Daten zu ändern, separat, ersetzen Sie die Linie, die ich mit dieser wies darauf hin:

point.add(new ArrayList<Integer>(values)); 

So sollten Sie separat zwei Kopien von values am Ende point hinzuzufügen.

point.get(0).set(1, 200); //0 denotes first element. not last 

werden Sie diese Ausgabe geben:

[[1, 200], [1, 2]] 

diese

Korrektur dieser beiden Fehler mit

point.get(point.size() - 1).set(1, 200); //last element 
ersetzt werden sollte, wird Ihnen die erwartete Ausgabe geben.

-1

Wenn Sie fügen Sie den zweiten Eintrag zu Punkt mit

point.add(point.get(point.size()-1)); 

Sie tatsächlich den Verweis auf das erste Array hinzufügen. Daher ist es natürlich, dass sie gleich sind und sich auch entsprechend ändern.

Sie benötigen würde ein neue Objekt als Kopie erstellen für sie einzigartig zu sein, wie

point.add(new ArrayList<Integer>(point.get(point.size()-1))); 
0

versuchen, diese

List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values = new ArrayList<Integer>(); 
    values.add(1);// x 
    values.add(2);// y 

    point.add(values); 
    List<Integer> secondList = new ArrayList<Integer>(point.get(point 
      .size() - 1)); 
    secondList.set(1, 200); 
    point.add(secondList); 
    System.out.println(point); 
0
List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values= new ArrayList<Integer>(); 
    values.add(1);//x 
    values.add(2);//y 

    point.add(values); 

    List<Integer> values2= new ArrayList<Integer>(); 
    values2.add(point.get(point.size()-1).get(0)); 
    values2.add(point.get(point.size()-1).get(1)); 

    point.add(values2); 
    point.get(1).set(1, 200); 
    System.out.println(point); 

Das wird gut funktionieren. Das Problem trat auf, da das zum Punkt hinzugefügte neue Element die gleiche Referenz wie das ursprüngliche Element hatte. Die vorgenommenen Änderungen werden also auf beide Elemente angewendet.

Verwandte Themen