Creative Forest

多次元配列

多次元配列の使い方

これまで扱ってきた配列は要素が直線状に並んだものであり、1次元配列と呼ぶこともできます。 Javaでは更に、2次元以上の配列を扱うこともできます。 2次元以上の配列をまとめて多次元配列(multidimensional array)とよびます。 多次元配列を使うことで、より複雑なデータ構造を実現することができます。 具体的には、2次元配列なら表計算のデータや数学の行列など、3次元配列なら3Dゲームの座標などの応用が考えられます。

実際には、多次元配列とは配列の入れ子に過ぎません。 「配列を要素として持つ配列」を2次元配列と呼び、「『配列を要素として持つ配列』を要素として持つ配列」を3次元配列と呼ぶのです。

多次元配列を利用する場合も、配列変数の宣言と配列本体の生成が必要です。 配列変数の宣言は次のような構文になります。

構文 : 配列変数の宣言(2次元の場合)
型名[][] 配列変数名;

例えば、int型の要素からなる2次元配列では、配列変数は次のように宣言します。

int[][] a;

他に、次の2通りの方法でも宣言できますが、こちらはあまり使われません。

int[] a[];
int a[][];

配列本体の生成は次のような構文になります。

構文 : 配列本体の生成(2次元の場合)
配列変数名 = new 型名[要素数][要素数];

例えば、int型の要素を持つ2行5列の配列本体を生成するには次のように記述します。

a = new int[2][5];

「int型の要素からなる要素数5の配列」を要素として持つ要素数2の配列本体を生成すると言うこともできます。

この場合、2次元配列の要素はa[0][0], a[0][1], a[0][2], a[0][3], a[0][4], a[1][0], a[1][1], a[1][2], a[1][3], a[1][4]の10個になります。

1次元配列と同様に、配列変数の宣言と配列本体の生成をまとめて行うこともできます。

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

この場合の2次元配列の様子を図 8-13に示しておきます。 ただし、ここでは配列変数による参照関係などは無視して、配列本体だけのイメージを図示してあります。 より詳しい図解は後ほど見ていただきます。

図 8-13 : 2次元配列(配列本体のみ)

同様に、3次元配列は次のように準備することができます。

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

では、2次元配列の使用例を見てみましょう。 ArraySample11は、5人分の英語と数学のテストの得点を表示するプログラムです。

ArraySample11.java
class ArraySample11 {
    public static void main(String[] args) {
        int[][] a = new int[2][5];

        a[0][0] = 64;    //1番目の人の英語の得点
        a[0][1] = 75;    //2番目の人の英語の得点
        a[0][2] = 40;    //3番目の人の英語の得点
        a[0][3] = 92;    //4番目の人の英語の得点
        a[0][4] = 58;    //5番目の人の英語の得点
        a[1][0] = 71;    //1番目の人の数学の得点
        a[1][1] = 62;    //2番目の人の数学の得点
        a[1][2] = 54;    //3番目の人の数学の得点
        a[1][3] = 90;    //4番目の人の数学の得点
        a[1][4] = 84;    //5番目の人の数学の得点

        for(int j =0; j < 5; j++){
            System.out.println((j + 1) + "番目の人の英語の得点は" + a[0][j] + "点です。");
            System.out.println((j + 1) + "番目の人の数学の得点は" + a[1][j] + "点です。");
        }
    }
}
ArraySample11の実行結果
1番目の人の英語の得点は64点です。
1番目の人の数学の得点は71点です。
2番目の人の英語の得点は75点です。
2番目の人の数学の得点は62点です。
3番目の人の英語の得点は40点です。
3番目の人の数学の得点は54点です。
4番目の人の英語の得点は92点です。
4番目の人の数学の得点は90点です。
5番目の人の英語の得点は58点です。
5番目の人の数学の得点は84点です。

ArraySample11では、a[0][j]に(j + 1)番目の人の英語の得点が、a[1][j]には(j + 1)番目の人の数学の得点が格納されています。 そして、for文を使ってそれぞれの人の英語と数学の得点を次々に表示していきます。

多次元配列の初期化

多次元配列の初期化では、{}の中に{}を入れた形になります。 初期化によって、ArraySample11と同じ内容の2次元配列を用意するには、次のように記述します。

        int[][] a = {{64, 75, 40, 92, 58}, {71, 62, 54, 90, 84}};

次のように改行を入れると、より見やすくなります。

        int[][] a = {
            {64, 75, 40, 92, 58},
            {71, 62, 54, 90, 84}
        };

ArraySample11を2次元配列の初期化を使って書き換えておきましょう。

ArraySample11A.java
class ArraySample11A {
    public static void main(String[] args) {
        int[][] a = {
            {64, 75, 40, 92, 58},
            {71, 62, 54, 90, 84}
        };

        for(int j =0; j < 5; j++){
            System.out.println((j + 1) + "番目の人の英語の得点は" + a[0][j] + "点です。");
            System.out.println((j + 1) + "番目の人の数学の得点は" + a[1][j] + "点です。");
        }
    }
}

もちろん、実行結果はArraySample11と同じです。

多次元配列の初期化では、{}の中に{}を入れた形になる。