2012-11-17 30 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

相关问题