2012-03-30 3 views
1

Ich arbeite mit zweidimensionalen Array-Werte, die in eine ArrayList eingefügt werden sollen. Dies geschieht jedoch in einer for-Schleife und der Wert des zweidimensionalen Array-Wertes wird geändert, während die Schleife ausgeführt wird, da sie nur als temporäre Variable verwendet wird (wodurch alle in der ArrayList gespeicherten Variablen geändert werden) Diese Variable ändert sich). Also, wenn ich versuche, den Inhalt der ArrayList auszudrucken, wenn die Schleife fertig ist, sind alle Werte gleich.Erstellen Sie eine Kopie einer Variablen und fügen Sie zu Arraylist

for(int i = 0; i <= Counter; i++) 
    { 

     if(Xhavetomove >= i) 
      arrayvalue[0][0] = this.Xspeed; 
     else 
      arrayvalue[0][0] = 0; 

     if(Yhavetomove >= i) 
      arrayvalue[0][1] = this.Xspeed; 
     else 
      arrayvalue[0][1] = 1; 

     System.out.println(arrayvalue[0][1]); 
     Object.movement.add(arrayvalue); 
    } 

Gibt es trotzdem kann ich es den Wert selbst speichern lassen?

Zum Beispiel: Das erste Mal, wenn die Schleife läuft, ist der Wert "5,5", aber wenn ich die ArrayList ausdrucke, wenn die Schleife fertig ist, sind alle Werte zu "5,1" geworden.

+0

Sie tun nur einen einzigen Array-Wert zu aktualisieren. Es gibt keine ArrayList, die ich sehen kann, es sei denn, du meinst das Ding, das du anrufst, "add" an. Aber Sie fügen immer denselben Wert hinzu und ändern denselben Wert. –

+0

Ich denke, Sie sind verwirrt zwischen [ArrayList] (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html) und [Array] (http: // www. go4expert.com/forums/showthread.php?t=1162). – Rajkiran

Antwort

2

Das Problem ist die Art und Weise Array hier zum Objekt hinzugefügt wird. Sie fügen das Array dem Objekt nicht hinzu. In diesem Fall fügen Sie die Adresse dem Speicherort im Speicher hinzu, in dem sich das Array befindet. Jedes Mal, wenn Sie das Array dem Objekt hinzufügen, fügen Sie jedes Mal dieselbe Adresse hinzu. Jedes Array im Objekt ist also immer wieder das gleiche Array, da sie alle auf einen einzigen Ort im Speicher zeigen. Wenn Sie also das Array ändern, wird es so aussehen, als würde es alle Objekte im Objekt verändern.

Am besten erstellen Sie entweder jedes Mal ein neues Array durch die Schleife, erstellen im Prinzip einen neuen Speicherort im Speicher für das Array oder clone() das Array, das eine neue Referenz erstellt.

Beispiel:

String[] houseOfStark = {"Eddard", "Catelyn", 
         "Robb", "Sansa", "Arya", "Bran", "Rickon"}; // Sorry Jon 
String[] copyOfStark = houseOfStark; 
String[] cloneOfStark = houseOfStark.clone(); 

houseOfStark[1] = "Lady Catelyn"; 

System.out.println(houseOfStark[1]); 
System.out.println(copyOfStark[1]); 
System.out.println(cloneOfStark[1]); 

produzieren:

Lady Catelyn 
Lady Catelyn 
Catelyn 

Good blog post explaining the difference

1

Sie benötigen clone() Methode Arrays verwenden, um seine Kopie zu machen:

//for example 
int[][] copy = (int[][])arraySource.clone(); 
2

Am Ende jeden Bedarf fügen Sie ein eigenes Objekt zu erstellen.

Zu verwenden Klon ist eine Möglichkeit.

Oder um die Werte immer paarweise hinzuzufügen, in einem anderen.

Ein völlig anderer Weg ist die Serialisierung. Dies ist sinnvoll, wenn Sie diese Werte nicht berechnen, sondern protokollieren möchten. In diesem Fall müssen Sie einen Output

Was durch definiert ist am besten, was wollen Sie mit Object.movement

Verwandte Themen