多次元配列

広告

配列は複数の値をまとめて管理できる便利なものですが、配列の各要素に代入する値に別の配列を使うことができます。

次の例を見てください。

int kokugo[] = {80, 92, 45};
int sansu[] = {75, 89, 54};

国語と算数の成績をそれぞれ3人分管理しています。3人分の国語の成績を管理するの配列を一つ利用し、3人分の算数の成績を管理するのに配列を1つ利用しています。

ここでこの二つの配列を値として考え、配列を値として格納するような別の配列を用意します。配列の宣言は次のようになっていました。

型名 配列変数名[];

作成しようとする配列に格納されるデータ型はint型の値を持つ配列です。つまりデータ型はint[]となります。よって配列を値として持つ配列は次のように記述することができます。

int[] seiseki[];

この配列は名前が「seiseki」で型名がint[]です。ただこの記述方法でもエラーとはなりませんが、通常は次のいずれかの記述方法を使います。

int seiseki[][];
int[][] seiseki;

この配列変数は値として配列を格納する配列です。この配列変数を使うことで3人分の成績を格納した配列を値として持つことができます。このような配列は多次元配列と呼ばれるます。

多次元配列の要素の確保

多次元配列であっても配列と違いはないので利用する前に要素の確保が必要であり次のように記述します。

型名 配列変数名[][];
配列変数名 = new 型名[要素数][];

例えば2つの要素を持つ場合には次のようになります。

int seiseki[][];
seiseki = new int[2][];

これで多次元配列の要素が確保されました。次に要素に値を格納していきますが、値として格納するのは別の配列です。例えば次のように記述します。

int seiseki[][];
seiseki = new int[2][];

int kokugo[];
kokugo = new int[3];
kokugo[0] = 80;
kokugo[1] = 92;
kokugo[2] = 45;

int sansu[];
sansu = new int[3];
sansu[0] = 75;
sansu[1] = 89;
sansu[2] = 54;

seiseki[0] = kokugo;
seiseki[1] = sansu;

丁寧に記述するとこのようになりますが、多次元代入に値として代入する配列を別に作らなくても次のように記述することができます。

int seiseki[][];
seiseki = new int[2][];

seiseki[0] = new int[3];
seiseki[1] = new int[3];

seiseki[0][0] = 80;
seiseki[0][1] = 92;
seiseki[0][2] = 45;

seiseki[1][0] = 75;
seiseki[1][1] = 89;
seiseki[1][2] = 54;

慣れないと分かりにくいと思いますがseiseki[0]をkokugoにseiseki[1]をsansuに置き換えてみて頂ければ分かると思います。

さらにまとめて次のように記述することができます。

int seiseki[][];
seiseki = new int[2][3];

seiseki[0][0] = 80;
seiseki[0][1] = 92;
seiseki[0][2] = 45;

seiseki[1][0] = 75;
seiseki[1][1] = 89;
seiseki[1][2] = 54;

この場合、int型の値を持つことができる要素を3つ分確保した配列を値として持つことができる要素を2つ確保した配列を作成します。結局のところ多次元配列における要素の確保は次のように記述できます。

型名 配列変数名[][];
配列変数名 = new 型名[要素数][値の配列の要素数];

また通常の配列と同じように配列の宣言と要素の確保はまとめて次のように記述することもできます。

型名 配列変数名[][] = new 型名[要素数][値の配列の要素数];

よって先ほどまでのサンプルは次のように記述できます。

int seiseki[][] = new int[2][3];

seiseki[0][0] = 80;
seiseki[0][1] = 92;
seiseki[0][2] = 45;

seiseki[1][0] = 75;
seiseki[1][1] = 89;
seiseki[1][2] = 54;

多次元配列は配列を値として持つような配列であり、複数の変数を使用することで繰り返し処理と組み合わせて多くの値をまとめて処理することができるようになります。

なお今回の多次元配列は2次元の配列でしたが、2次元の配列を値として持つような3次元の配列など何次元の配列でも作成は可能です。

サンプル

では簡単な例で試しておきます。

JSample7_1.java

class JSample7_1{
  public static void main(String args[]){
    int seiseki[][] = new int[2][3];

    seiseki[0][0] = 80;
    seiseki[0][1] = 92;
    seiseki[0][2] = 45;

    seiseki[1][0] = 75;
    seiseki[1][1] = 89;
    seiseki[1][2] = 54;

    String kyoka[] = {"国語", "数学"};

    for (int i = 0; i < 2; i++){
      System.out.println(kyoka[i] + "の成績");

      for (int j = 0; j < 3; j++){
        System.out.println(seiseki[i][j]);
      }
    }
  }
}

コンパイル後に実行すると次のように表示されます。

p7-1

今回のサンプルのように多次元配列に含まれる値を繰り返し処理をネスト(入れ子にすること)させて処理することはよく使われる方法です。

多次元配列は便利ですが、あまり多次元にすると分かりにくいプログラムになってしまいますので作る場合でも3次元くらいまでにしておくことをお薦めします。

( Written by Tatsuo Ikura )