2012-03-30 39 views
1

我正在處理應插入到ArrayList中的二維數組值。但是這是在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,我可以看到,除非你的意思是你調用「添加」的東西。但是你總是添加相同的值,並修改相同的值。 – 2012-03-30 11:51:31

+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 2012-03-30 11:54:55

回答

2

的問題是陣列添加到對象來這裏的路上。您不是將數組添加到對象。發生什麼事是您將地址添加到陣列所在的內存中的位置。因此,每次將陣列添加到對象時,都會每次添加相同的地址。因此,對象中的每個數組實際上都是相同的數組,因爲它們都指向內存中的單個位置。所以當你改變數組的時候,它會在對象內部改變它們。

要做的最好的事情是要麼每次通過循環創建一個新的數組,要麼創建一個新的位置在數組駐留內存或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

相關問題