要素を個別に初期化する - 萌えJava超入門
第二十三章 多次元配列

要素を個別に初期化する


要素数を上位から順番に初期化する方法もあります。
子配列の要素数は一律でなくても構いません。

int[][] arrays = new int[3][]; 
 arrays[0] = new int[2];
 arrays[1] = new int[3];
 arrays[2] = new int[4];


目次


1. 要素を個別に初期化する


以下は、二次元配列の要素を個別に初期化する例です。

書式
 データ型[][] 変数名 = new データ型[要素数N][];

  変数名[0] = new データ型[要素数0];
  変数名[1] = new データ型[要素数1];
  変数名[2] = new データ型[要素数2];
   ・
   ・
   ・
  変数名[要素数N-1] = new データ型[要素数X];

二次元 int 配列の変数宣言例
 int[][] arrays = new int[3][];
  arrays[0] = new int[2];
  arrays[1] = new int[3];
  arrays[2] = new int[4];

子配列の要素数は一律でなくても構いません。



2. arrays = new int[3][] の解説


int[][] arrays = new int[3][];

左側の「[]」(角カッコ)にのみ数値を入れました。
arrays には、要素数3の配列インスタンスが代入されますが、
この配列の要素は、初期化されていません。
初期値の「null」が入っている状態です。

子配列は初期化されていない。
まだ初期値の「null」だ。
なんか変な形っス。
//Sample23_04.java
class Sample23_04{

  public static void main(String[] args){

      int[][] arrays = new int[3][];

      System.out.println("arrays.length = " + arrays.length);

      System.out.println("arrays[0] = " + arrays[0]);  //null
      System.out.println("arrays[1] = " + arrays[1]);  //null
      System.out.println("arrays[2] = " + arrays[2]);  //null
    }
}

コマンドライン
>javac Sample23_04.java
>java Sample23_04

arrays.length = 3
arrays[0] = null
arrays[1] = null
arrays[2] = null




3.サンプルコード


子配列を初期化しよう。
//Sample23_05.java
class Sample23_05{

  public static void main(String[] args){

      int[][] arrays = new int[3][];

      System.out.println("arrays.length = " + arrays.length);

      System.out.println("arrays[0] = " + arrays[0]);  //null
      System.out.println("arrays[1] = " + arrays[1]);  //null
      System.out.println("arrays[2] = " + arrays[2]);  //null

      /*ここまで同じ*/

      arrays[0] = new int[2];  //初期化
      System.out.println(
          "arrays[0].length = " + arrays[0].length
      );
      arrays[0][0] = 0;
      arrays[0][1] = 1;

      arrays[1] = new int[3];  //初期化
      System.out.println(
          "arrays[1].length = " + arrays[1].length
      );
      arrays[1][0] = 10;
      arrays[1][1] = 11;
      arrays[1][2] = 12;

      arrays[2] = new int[4];  //初期化
      System.out.println(
          "arrays[2].length = " + arrays[2].length
      );
      arrays[2][0] = 20;
      arrays[2][1] = 21;
      arrays[2][2] = 22;
      arrays[2][3] = 23;

      /*値の表示*/

      System.out.println();
      System.out.println("arrays[0][0] = " + arrays[0][0]);
      System.out.println("arrays[0][1] = " + arrays[0][1]);
      System.out.println("arrays[1][0] = " + arrays[1][0]);
      System.out.println("arrays[1][1] = " + arrays[1][1]);
      System.out.println("arrays[1][2] = " + arrays[1][2]);
      System.out.println("arrays[2][0] = " + arrays[2][0]);
      System.out.println("arrays[2][1] = " + arrays[2][1]);
      System.out.println("arrays[2][2] = " + arrays[2][2]);
      System.out.println("arrays[2][3] = " + arrays[2][3]);
    }
}

コマンドライン
>javac Sample23_05.java
>java Sample23_05

arrays.length = 3
arrays[0] = null
arrays[1] = null
arrays[2] = null
arrays[0].length = 2  <---初期化された
arrays[1].length = 3  <---初期化された
arrays[2].length = 4  <---初期化された

arrays[0][0] = 0
arrays[0][1] = 1
arrays[1][0] = 10
arrays[1][1] = 11
arrays[1][2] = 12
arrays[2][0] = 20
arrays[2][1] = 21
arrays[2][2] = 22
arrays[2][3] = 23


これはちょっと
面倒っすね。
ん~。
確かにコード長いなぁ。


4.for文の入れ子で多次元配列を参照する


表示の部分をfor文で完結に書きましょう。
これはぜひ覚えてくれ。
よく出てくる。
for文の入れ子で多次元配列を参照する
  for(int i=0 ;i<arrays.length; i++){
      for(int j=0 ;j<arrays[i].length; j++){
          System.out.println( arrays[i][j] );
      }
  }

//Sample23_07.java
class Sample23_07{

  public static void main(String[] args){

      int[][] arrays = new int[3][];

      System.out.println("arrays.length = " + arrays.length);

      arrays[0] = new int[2];
      System.out.println(
          "arrays[0].length = " + arrays[0].length
      );
      arrays[0][0] = 0;
      arrays[0][1] = 1;

      arrays[1] = new int[3];
      System.out.println(
          "arrays[1].length = " + arrays[1].length
      );
      arrays[1][0] = 10;
      arrays[1][1] = 11;
      arrays[1][2] = 12;

      arrays[2] = new int[4];
      System.out.println(
          "arrays[2].length = " + arrays[2].length
      );
      arrays[2][0] = 20;
      arrays[2][1] = 21;
      arrays[2][2] = 22;
      arrays[2][3] = 23;

      System.out.println();

      /*表示*/
      for(int i=0 ;i<arrays.length; i++){
          for(int j=0 ;j<arrays[i].length; j++){

              System.out.println(
                  "arrays["+i+"]["+j+"] = "+arrays[i][j]
              );

          }
      }
    }
}

for文の入れ子の解説
  1. 外側のfor文は、カウンタ変数が i です。i の初期値は0です。
  2. 次に内側のfor文に入ります。カウンタ変数は j です。
  3. 内側のfor文は、i の値が 0 のまま、
    j==0 から j<arrays[i].length の間読み続けます。

  4. 内側のfor文を読み終わると、外側のfor文に戻って i++ します。
  5. 内側のfor文は、i の値はそのままで、
    再び j==0 から j<arrays[i].length の間読み続けます。
  6. 「4.」に戻ります。
  7. この調子で、外側のfor文が i<arrays.length の間続けます。

コマンドライン
>javac Sample23_07.java
>java Sample23_07

arrays.length = 3
arrays[0].length = 2
arrays[1].length = 3
arrays[2].length = 4

arrays[0][0] = 0
arrays[0][1] = 1
arrays[1][0] = 10
arrays[1][1] = 11
arrays[1][2] = 12
arrays[2][0] = 20
arrays[2][1] = 21
arrays[2][2] = 22
arrays[2][3] = 23


そんなにサクッと
覚えられないわよ。
大丈夫。
何度も出てくる。


お疲れ様でした。




© 2019 awasekagami