2012-03-30 10 views
1

ArrayListに挿入する2次元の配列値を扱っています。しかしこれはforループで行われ、二次元配列値の値は、変数がただちに一時変数として使用されるのでループが実行されると変更されます(これにより、ArrayListに格納されている変数はすべてこの変数が変わります)。 ループが完了したときにArrayListの内容を出力しようとすると、すべての値が同じになります。変数のコピーを作成して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); 
    } 

とにかく値自体を保存することはできますか?

例:ループが最初に実行されたときの値は「5,5」ですが、ループが完了したときにArrayListを出力すると、すべての値が「5,1」に変わります。

+0

あなたは、単一の配列値を更新していると何をしたいかによって定義されている何

。私が見ることができるArrayListはありません。あなたが "add"と呼んでいることを意味しない限り。しかし、常に同じ値を追加し、同じ値を変更します。 –

+0

私はあなたが[ArrayList](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html)と[Array](http:// www。 go4expert.com/forums/showthread.php?t=1162)。 – Rajkiran

答えて

2

問題は、アレイが、ここで、オブジェクトに追加される方法です。オブジェクトに配列を追加していません。何が起こっているのかは、配列が存在するメモリ内の場所にアドレスを追加することです。したがって、オブジェクトに配列を追加するたびに、毎回同じアドレスを追加しています。したがって、オブジェクト内のすべての配列は、メモリ内の単一の場所を指しているため、実際は同じArrayです。したがって、配列を変更すると、オブジェクト内のすべてを変更するように見えます。

ループのたびに新しいアレイを作成するか、アレイ内のメモリに新しい位置を作成するか、新しい配列を作成する配列clone()を作成することをお勧めします。

例:

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]); 

が生成されます。それぞれが独自のオブジェクトを作成する必要性を追加し終わり

Lady Catelyn 
Lady Catelyn 
Catelyn 

Good blog post explaining the difference

1

あなたはそのコピーを作成するために、アレイのclone()メソッドを使用する必要があります。

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

クローンは片道です。

または常に値をペアで追加します。

全く異なる方法は、シリアル化を使用することです。これは、この値を計算するのではなくログに記録したいときに意味があります。この場合、あなたがたOutputStreamに必要な最高のは、あなたがObject.movement

関連する問題