多次元配列の構成

配列本体の生成過程を分解する

図 8-13では、次の文を実行したときに生成される2次元配列の配列本体だけを図示しました。

int[][] a = new int[2][5];

ここでは、実際の参照関係も含めて見ていきましょう。 図 8-14は、この2次元配列の様子をより詳しく表しています。

図 8-14 : 2次元配列の詳細

配列変数aが要素数2の配列本体を参照しています。 さらに、その要素であるa[0]とa[1]のそれぞれが、また配列変数になっていて、どちらも要素数5の配列本体を参照しています。 2次元配列とは「配列を要素として持つ配列」であるということがお分かりいただけたでしょうか。

ところで、配列変数の宣言と配列本体の生成を次のように分けて書けることは既にご存知の通りですね。

int[][] a;
a = new int[2][5];

実は、この2行目の配列本体の生成の部分をさらに分けて、次のように書くこともできるのです。

int[][] a;
a = new int[2][];
a[0] = new int[5];
a[1] = new int[5];

図 8-15は、この4行の処理の過程を詳しく説明しています。 最終的には図 8-14と同じ形になっていることがお分かりいただけるでしょう。

図 8-15 : 配列本体の生成過程を分解する

要素数がそろっていない多次元配列

上の例では、2行5列の長方形の形をした2次元配列を扱いました。 そこでは、2つの行を表す配列は、どちらも要素数5でした。 実は、これらの行を表す配列の要素数(長さ)は、必ずしもそろっていなくてよいのです。

このことをArraySample12で確認してみましょう。

ArraySample12.java
class ArraySample12 {
    public static void main(String[] args) {
        int[][] a;
        a = new int[4][];
        a[0] = new int[2];
        a[1] = new int[4];
        a[2] = new int[3];
        a[3] = new int[5];

        System.out.println("配列aの長さは " + a.length);
        for(int i = 0; i < a.length; i++){
            System.out.println("配列a[" + i +"]の長さは" + a[i].length + "です。");
        }

        for(int i = 0; i < a.length; i++){
            for(int j = 0; j < a[i].length; j++){
                System.out.printf(" %2d", a[i][j]);
            }
            System.out.println();
        }
    }
}
図 8-16 : ArraySample12の実行結果

ArraySample12で作られる2次元配列の様子は図 8-17のようになります。 a[0], a[1], a[2], a[3]が指す配列の長さがそろっていないことがお分かりいただけるでしょう。 尚、それらの配列の要素は、すべて既定値0が格納されています。

図 8-17 : 要素数(長さ)がそろっていない2次元配列

配列変数aが指す配列本体の長さはa.lengthで表され、その値は4です。 配列変数a[0]が指す配列本体の長さはa[0].lengthで表され、その値は2です。 同様に、a[1].lengthの値は4、a[2].lengthの値は3、a[3].lengthの値は5です。

もちろん、要素数(長さ)がそろっていない状態で、多次元配列を初期化することもできます。 配列の初期化を使ってArraySample12を書き換えたものが、次のArraySample12Aです。 ただし、今度は既定値の0ではなく、いろいろな値で初期化しています。

ArraySample12A.java
class ArraySample12A {
    public static void main(String[] args) {
        int[][] a = {
            {0, 1},
            {10, 11, 12, 13},
            {20, 21, 22},
            {30, 31, 32, 33, 34}
        };

        System.out.println("配列aの長さは " + a.length);
        for(int i = 0; i < a.length; i++){
            System.out.println("配列a[" + i +"]の長さは" + a[i].length + "です。");
        }

        for(int i = 0; i < a.length; i++){
            for(int j = 0; j < a[i].length; j++){
                System.out.printf(" %2d", a[i][j]);
            }
            System.out.println();
        }
    }
}
図 8-18 : ArraySample12Aの実行結果

Javaの多次元配列とは配列の入れ子に過ぎず、要素数(長さ)のそろっていない多次元配列を作ることもできる。