マンガで分かる Java入門講座

第6章 文字列と配列
6-11. 配列5 多次元配列

配列がネストした「多次元配列」について紹介します。

● 多次元配列

 基本型の配列には、要素として値を入れます。参照型の配列には、要素として参照を入れます。この「配列に入れる参照」には、「配列の参照」も指定できます。

 こうやって作った入れ子構造の配列のことを「多次元配列」と呼びます。また、入れ子になっていることを「ネスト」していると呼びます。

 そういった配列の入れ子構造を利用することで、エクセルなどの表計算ソフトのような表構造のデータを作成することができます。

 表計算ソフトのような表構造は縦と横に軸を持つ2次元のデータです。こういった配列を「2次元配列」と呼びます。

 さらに軸を増やすことで、「3次元」「4次元」と拡張していくことができます。


● 2次元配列

 最もよく使われる多次元配列は、2次元配列です。ここでは2次元配列の作り方を示します。

ソースコード)2次元配列を作り、値を入れる
int[][] a2d = new int[4][3];

for (int y = 0; y < 3; y ++) {
    for (int x = 0; x < 4; x ++) {
        a2d[x][y] = (x+1) * 10 + (y+1);
    }
}

 2次元配列は「int[ ][ ]」のように「[ ]」を2つ付けることで変数を宣言します。また、実際の配列は「new int[4][3]」のようにして作成します。この時、最初の「[4]」が、1次元目の要素数、次の「[3]」が2次元目の要素数になります。

 この配列の要素には、「a2d[0][0]」のように2つの添え字を指定することでアクセスできます。

ソースコード)2次元配列から、値を取り出す
for (int y = 0; y < 3; y ++) {
    for (int x = 0; x < 4; x ++) {
        System.out.print(a2d[x][y] + ",");
    }
    System.out.println("");
}

出力)2次元配列から、値を取り出す
101,201,301,401,
102,202,302,402,
103,203,303,403,

● 多次元配列と使用メモリー

 2次元配列ではそれほどではないですが、高次の多次元配列を作るとメモリを非常に消費します。

 たとえば、各次元が要素数100の2次元配列では、要素数100×100で、10,000(1万)要素分のメモリを消費します。

 これが3次元配列の場合は、要素数100×100×100で、1,000,000(100万)要素分のメモリを消費します。4次元配列の場合は、要素数100×100×100×100で、100,000,000(1億)要素分のメモリを消費します。

 メモリを多く使うと、コンピュータの動作が重くなります。

 そのため、高次の多次元配列を作る場合には、少し考えて、データの持ち方を工夫するようにした方がよいです。


● 各次元を後で初期化

 配列では、先に変数だけ宣言しておき、後で配列を初期化することができました。

ソースコード)後で配列を初期化
int[] a;
a = new int[4];

 同じように、多次元配列も、先に変数だけ宣言しておき、後で配列を初期化することができます。

ソースコード)後で配列を初期化
int[][] a2d = new int[3][];
    // この時点ではa2d[0]、a2d[1]、a2d[2]はnull

// それぞれの位置に、要素数3の配列の参照を入れる
a2d[0] = new int[3];  // a2d[0]の位置
a2d[1] = new int[3];  // a2d[1]の位置
a2d[2] = new int[3];  // a2d[2]の位置

 この際、2次元目以降の各配列の要素数を個別に変えることも可能です。

ソースコード)2次元目以降の各配列の要素数を変える
int[][] a2d = new int[3][];
a2d[0] = new int[1];
a2d[1] = new int[3];
a2d[2] = new int[2];

for (int i = 0; i < a2d.length; i ++) {
    System.out.println(a2d[i].length);
}
質問等、お問い合わせ先
分からない点などあれば
メールをください。



この講座のマンガ部分は「箱人形マンガ(Box Comic) 」で作成しています。
作成:2013/05/27  更新:2015/08/09  [Permalink]
カテゴリー
基本情報