Thinkers'Studio
JavaとC言語の自習ツール
別の配列を使った2次元配列の初期化や代入

 今回は、別の配列を使って2次元配列初期化したり、代入についての Tips です。
 その場合に、注意が必要な「参照のコピー」についても触れます。

 2次元配列の初期化例として、よく出てくるのは次のような形です。
  //3教科の5人の点数
  int[][] kyoka3 = { { 92,98,76,52,81 }, { 75,89,77,68,84 }, { 96,73,91,88,64 } };
 配列要素の値を { } で囲んで、配列の配列とする書き方で、以前のTips でも紹介しました。

配列を書き並べて2次元配列を初期化する

 では、上の例で各教科ごとの点数が入った配列があるとき、それらを使って初期化するにはどうすればよいでしょう。
 その配列名を書き並べて、次のように初期化することができます。
【 書き方例(1) 】
  //各教科の点数配列
  int[] kokugo = { 92,98,76,52,81 };
  int[] sugaku = { 75,89,77,68,84 };
  int[] eigo   = { 96,73,91,88,64 };
  //配列名を指定して初期化する
  int[][] kyoka3 = { kokugo, sugaku, eigo };

配列を2次元配列に代入する

 初期化でなく、用意した2次元配列に次元を指定して配列を代入する書き方もできます。
【 書き方例(2) 】
  int[][] kyoka3 = new int[3][];
  //配列を各次元へ代入する
  kyoka3[0] = kokugo;
  kyoka3[1] = sugaku;
  kyoka3[2] = eigo;

注意が必要なこと(参照のコピー)

 ただし、【 書き方例(1) 】【 書き方例(2) 】の方法では、注意が必要なことがあります。 たとえば ・・・
     kyoka3[2][0] = 100; とすると初期化時に指定した元の配列eigo[0]も100点に変わり、
     kokugu[0] = 0;     とすると、kyoka3[0][0]も0に変わります。

 これは、参照のコピーをしているだけだからです。 コピー元もコピー先も同じ実体を参照することになるので、どちらかの値を書き換えると、もう一方から見る値も変わります。そのことに注意して使いましょう。

 もし、別物として扱いたいときは、new を使って新しく用意した実体にコピーを代入します。
  int[][] kyoka3 = new int[3][];
  //別の場所に用意された実体を参照するようになる
  kyoka3[0] = new int[kokugo.length];
  for( int i = 0; i < kokugo.length; i++ )
      kyoka3[0][i] = kokugo[i];

(今週のクイズはありません)

[ 関連記事 ] 2次元配列の使用例, 2次元配列の初期化、メソッドに渡す例

前回のクイズの答え:(前回の問題を見る
public boolean isKisu( int n ) { 
    return n%2==0 ? false : true;
}