1

这个问题是这个问题的后续..

使用 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(列表),新的additiion覆盖了所有其他条目,导致所有条目与最后一个条目相同。我整天都在尝试,如果我使用向量或堆栈,它也是一样的。这是怎么回事?

4

3 回答 3

1

如果要存储对象数组,则应为每个条目创建一个新对象。不要添加对象,然后更改一些实例值,然后再次添加它们,这也会更改所有其他条目。(阅读有关 Java 的面向对象方法的更多信息)。

于 2012-11-17T23:43:46.797 回答
1

由于您一遍又一遍地操作同一个数组中的值,并且 ArrayList 不会复制添加到其中的元素,而只是引用它们,因此 ArrayList 中的每个条目都引用同一个数组,该数组具有最后一个状态,它给了。

于 2012-11-17T23:48:54.847 回答
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是一个不同的数组。

于 2012-11-18T00:24:49.180 回答