这个问题是这个问题的后续问题。
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(列表)时,新的additi会覆盖所有其他因素导致所有条目与最后一个相同。我一直在尝试,如果我使用向量或堆栈,它是一样的...发生了什么?
答案 0 :(得分:1)
如果要存储对象数组,则应为每个条目创建一个新对象。不要添加对象,然后更改某个实例值,然后再次添加它们,这也将更改所有其他条目。 (阅读有关Java的面向对象方法的更多信息)。
答案 1 :(得分:1)
由于你一遍又一遍地操作同一个数组中的值,并且ArrayList不会复制添加到它的元素,而只是引用它们,所以ArrayList中的每个条目都引用相同的数组,该数组具有最后一个状态,已经给出了。
答案 2 :(得分: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
然后{{1}}中的每个条目都是不同的数组。