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 回実行されます。最後の行から期待しているのは、各ループがインデックス 0 のリストに 2D 配列を格納することです。したがって、2 番目のループはインデックス 1 のリストに 2 番目の 2D キーセレクションを格納します。追加するたびにArraylist(リスト)への新しい追加により、他のすべてが上書きされ、すべてのエントリが最後と同じになります..一日中試してみましたが、ベクトルまたはスタックを使用しても同じです..何が起こっているのですか?

4

3 に答える 3

1

同じ配列内の値を何度も操作しており、ArrayList は追加された要素のコピーを作成せず、それらを参照するだけであるため、ArrayList 内の各エントリは同じ配列を参照します。これは最後の状態を持ちます。与えられています。

于 2012-11-17T23:48:54.847 に答える
1

オブジェクトの配列を格納する場合は、各エントリに新しいオブジェクトを作成する必要があります。オブジェクトを追加せずに、いくつかのインスタンス値を変更してから再度追加してください。これにより、他のすべてのエントリも変更されます。(Java のオブジェクト指向アプローチの詳細をお読みください)。

于 2012-11-17T23:43:46.797 に答える
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 に答える