2012-11-17 39 views
1

這個問題是這一個後續..加成的ArrayList覆蓋休息,這是爲什麼

Add Multidimensinal array to an array list using Java

int tmp; 
    int[][] Key = new int [TopSubKey.length+BottomSubKey.length][TopSubKey.length]; 
    int[][] KeyChoiceTable = {{14,17,11,24,1,5},{3,28,15,6,21,10},{23,19,12,4,26,8}}  
int [][] KeySelection = new int [KeyChoiceTable.length][KeyChoiceTable[0].length]; 

List<int [][]> list = new ArrayList<int [][]>(); 


int row,col,x; 

for(int l =0;l<3;l++) { 

for(int i=0;i<KeyChoiceTable.length;i++){ 
    for(int j=0;j<KeyChoiceTable[0].length;j++){ 
     row = 0; 
     col = 0; 
     x = KeyChoiceTable[i][j]; 
     while(x>7){x=x-7; row=row+1;} 
     col = x-1; 

    KeySelection[i][j] = Key[row][col]; 
    } 
} 
list.add(KeySelection); 
System.out.print(list.size()); 
    } 

如果你能看看..因爲問題似乎很愚蠢,但它殺了我。

的LOPP運行2次,我所從最後一行期望爲每個循環存儲在列表中的2D陣列在索引0處,因此,第二回路存儲第二2D Keyselection在列表索引1處 每當我添加到Arraylist(列表)新添加覆蓋所有其他導致所有條目與最後一樣..我一直在嘗試整天,其相同的,如果我使用向量或堆棧..什麼是繼續?

+1

向我們顯示您的代碼。將其粘貼到您的問題中。嘗試包含仍顯示問題的最小代碼。 – Bohemian

+1

如果您提出問題,請在問題中提供相關信息,而不是提及更早的問題。 –

+1

我編輯了這個問題 – user1111726

回答

0

當您將KeySelection添加到list時,您確實添加了對它的引用,而不是副本。在下一次迭代中更改KeySelection時,更改也反映在list中。爲了避免這種情況,申報KeySelection在相同的範圍內,你將它添加到list

for(int l =0;l<3;l++) { 
    int [][] keySelection = new int [KeyChoiceTable.length][KeyChoiceTable[0].length]; 
    // Populate keySelection 
    list.add(keySelection); 
    System.out.print(list.size()); 
} 

然後在list每個條目是不同的陣列。

+0

@RobEarl。 .You ROCK BIG TIME ..你看到了什麼讓我對java產生了興趣..我一直堅持我的椅子整個早上試圖解決這個問題,它只是需要一個小小的變化..再次感謝Man – user1111726

1

如果要存儲一個對象數組,則應該爲每個條目創建一個新對象。不要添加對象,然後更改某個實例值並再次添加它們,這也會更改所有其他條目。 (閱讀更多關於Java的面向對象的方法)。

1

由於您一次又一次操作同一個數組中的值,並且ArrayList不會創建添加到其中的元素的副本,而只是引用它們,所以ArrayList中的每個條目都引用同一個數組,最後的狀態,它給出。

+1

那麼我該如何解決這個問題呢? – user1111726

+0

獲取對象的副本使用克隆方法。順便說一句。在你的代碼示例中是缺少的;循環運行3次。也不使用溫度。 – Sohalt

+0

是的..我修剪了部分代碼(tmp)..你是如何建議使用克隆。我在java中是一個noob,我試圖破解我的方式,但我需要更多的幫助 – user1111726

相關問題