Javaの配列には、これまで学習してきた1次元配列のほかに、複数の次元を持つ「多次元配列」があります。
多次元配列を使うと、表のように行と列に分けてデータを管理できます。今回は、特によく使われる「2次元配列」を中心に、宣言方法や値の取り出し方、繰り返し処理での使い方を学習しましょう。
多次元配列とは、配列の中に配列を持つ構造のことです。
これまで学習してきた1次元配列は、複数の値を横一列に並べて管理するイメージです。
int[] scores = {80, 70, 90, 85};
一方、2次元配列では、行と列を使って表のようにデータを管理できます。
例えば、3人の生徒の4教科の点数を管理する場合、次のような表をイメージしてください。
このように、複数の行と列を使ってデータを整理できるのが2次元配列の特徴です。
2次元配列は、データ型の後ろに角括弧を2組付けて宣言します。
int[][] scores = {
{80, 70, 90, 85},
{60, 85, 75, 70},
{90, 95, 80, 88}
};
この配列は、3行4列の構造になっています。
各行のデータは、次のように並んでいます。
なお、Javaの2次元配列は、厳密には「配列の中に配列がある構造」です。そのため、行ごとに要素数を変えることもできます。今回は、理解しやすいようにすべての行が4列の配列を使用します。
2次元配列の値を取り出すときは、行番号と列番号を指定します。
System.out.println(scores[0][0]); // 80
System.out.println(scores[0][1]); // 70
System.out.println(scores[1][2]); // 75
System.out.println(scores[2][3]); // 88
配列のインデックスは、0から始まる点に注意してください。
scores[0][0]:1行目の1列目scores[0][1]:1行目の2列目scores[1][2]:2行目の3列目scores[2][3]:3行目の4列目例えば、scores[1][2]は、行番号が1、列番号が2なので、2行目の3列目にある値「75」を取り出します。
行番号も列番号も0から始まります。1から数えないように注意しましょう。
2次元配列の値を変更するときも、行番号と列番号を指定します。
int[][] scores = {
{80, 70, 90, 85},
{60, 85, 75, 70},
{90, 95, 80, 88}
};
scores[0][0] = 95;
System.out.println(scores[0][0]); // 95
この例では、1行目の1列目にある値を80から95に変更しています。
配列の要素を指定する方法は、1次元配列と同じ考え方です。2次元配列では、行番号と列番号の2つを指定する点が異なります。
2次元配列では、lengthを使って行数や各行の要素数を取得できます。
System.out.println(scores.length); // 3
System.out.println(scores[0].length); // 4
それぞれの意味は次のとおりです。
scores.length:配列全体の行数(3)scores[0].length:1行目の要素数(4)2次元配列は「配列の中に配列がある構造」なので、外側の配列のlengthで行数を、各行のlengthでその行の要素数を取得します。
行ごとに要素数が異なる配列では、scores[0].lengthがすべての行に共通するとは限りません。各行の要素数を確認したい場合は、scores[i].lengthのように指定します。
2次元配列のすべての要素を処理するには、for文を2重に使う方法が便利です。
int[][] scores = {
{80, 70, 90, 85},
{60, 85, 75, 70},
{90, 95, 80, 88}
};
for (int i = 0; i < scores.length; i++) {
for (int j = 0; j < scores[i].length; j++) {
System.out.print(scores[i][j] + " ");
}
System.out.println();
}
実行結果は次のようになります。
80 70 90 85
60 85 75 70
90 95 80 88
このプログラムでは、外側のfor文で行を切り替え、内側のfor文で各行の要素を順番に取り出しています。
i:行番号j:列番号scores[i][j]:i行目・j列目の要素外側のfor文は、scores.lengthを使って行数分だけ繰り返します。内側のfor文は、scores[i].lengthを使って、現在の行にある要素数分だけ繰り返します。
内側のfor文が終わったあとにSystem.out.println();を実行することで、次の行に移動します。
2次元配列では、外側のループが行、内側のループが列を処理すると覚えておきましょう。
インデックスを使わずに配列の要素を順番に取り出したい場合は、拡張for文を使うこともできます。
for (int[] row : scores) {
for (int score : row) {
System.out.print(score + " ");
}
System.out.println();
}
実行結果は、通常のfor文を使った場合と同じです。
80 70 90 85
60 85 75 70
90 95 80 88
この例では、外側の拡張for文で1行分の配列を取り出し、内側の拡張for文でその行の各要素を取り出しています。
int[] row:1行分の配列int score:行の中にある各要素拡張for文は、配列の要素を順番に処理したいときに便利です。一方、行番号や列番号を使って特定の要素を操作したい場合は、通常のfor文が適しています。
多次元配列を使う際は、次の点に注意しましょう。
lengthは行数を表す。lengthは、その行に含まれる要素数を表す。例えば、今回の配列は3行4列なので、行番号は0~2、列番号は0~3の範囲で指定します。
scores[3][0]やscores[0][4]のように範囲外のインデックスを指定すると、ArrayIndexOutOfBoundsExceptionが発生します。
今回は、多次元配列の基本と、2次元配列の使い方について学習しました。
scores[行番号][列番号]の形式で指定する。scores.lengthで行数を、scores[i].lengthで各行の要素数を取得できる。多次元配列は、成績表や座席表など、行と列で整理されたデータを扱うときに役立ちます。まずは、行番号と列番号を指定して値を取り出す方法と、2重のfor文による繰り返し処理をしっかり理解しましょう。
次のプログラムを実行すると、何が表示されるでしょうか。
int[][] data = {
{10, 20, 30, 40},
{50, 60, 70, 80},
{90, 100, 110, 120}
};
System.out.println(data[1][2]);
System.out.println(data.length);
System.out.println(data[0].length);
答えは次のとおりです。
70
3
4
data[1][2]は2行目の3列目なので70、data.lengthは行数の3、data[0].lengthは1行目の要素数の4となります。