2026.09.30Java応用 #17|多次元配列TECH BLOG

Java応用 #17|多次元配列とは?2次元配列で表形式のデータを扱おう

Javaの配列には、これまで学習してきた1次元配列のほかに、複数の次元を持つ「多次元配列」があります。

多次元配列を使うと、表のように行と列に分けてデータを管理できます。今回は、特によく使われる「2次元配列」を中心に、宣言方法や値の取り出し方、繰り返し処理での使い方を学習しましょう。

1. 多次元配列とは?

多次元配列とは、配列の中に配列を持つ構造のことです。

これまで学習してきた1次元配列は、複数の値を横一列に並べて管理するイメージです。

int[] scores = {80, 70, 90, 85};

一方、2次元配列では、行と列を使って表のようにデータを管理できます。

例えば、3人の生徒の4教科の点数を管理する場合、次のような表をイメージしてください。

  • 行:生徒
  • 列:教科

このように、複数の行と列を使ってデータを整理できるのが2次元配列の特徴です。

2. 2次元配列の宣言と初期化

2次元配列は、データ型の後ろに角括弧を2組付けて宣言します。

int[][] scores = {
    {80, 70, 90, 85},
    {60, 85, 75, 70},
    {90, 95, 80, 88}
};

この配列は、3行4列の構造になっています。

  • 行数:3行(3人分のデータ)
  • 列数:4列(4教科分のデータ)

各行のデータは、次のように並んでいます。

  • 1行目:80、70、90、85
  • 2行目:60、85、75、70
  • 3行目:90、95、80、88

なお、Javaの2次元配列は、厳密には「配列の中に配列がある構造」です。そのため、行ごとに要素数を変えることもできます。今回は、理解しやすいようにすべての行が4列の配列を使用します。

3. 2次元配列の値を取り出す

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から数えないように注意しましょう。

4. 2次元配列の値を変更する

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つを指定する点が異なります。

5. 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のように指定します。

6. for文を使って2次元配列を処理する

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次元配列では、外側のループが行、内側のループが列を処理すると覚えておきましょう。

7. 拡張for文を使って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文が適しています。

8. 多次元配列の注意点

多次元配列を使う際は、次の点に注意しましょう。

  • インデックスは0から始まる。
  • 2次元配列では、行番号と列番号の2つを指定する。
  • 外側の配列のlengthは行数を表す。
  • 各行のlengthは、その行に含まれる要素数を表す。
  • 配列の範囲を超えたインデックスを指定すると、実行時に例外が発生する。

例えば、今回の配列は3行4列なので、行番号は0~2、列番号は0~3の範囲で指定します。

scores[3][0]やscores[0][4]のように範囲外のインデックスを指定すると、ArrayIndexOutOfBoundsExceptionが発生します。

9. まとめ

今回は、多次元配列の基本と、2次元配列の使い方について学習しました。

  • 多次元配列は、配列の中に配列を持つ構造である。
  • 2次元配列は、行と列を使ってデータを管理できる。
  • 値を取り出すときは、scores[行番号][列番号]の形式で指定する。
  • scores.lengthで行数を、scores[i].lengthで各行の要素数を取得できる。
  • 2重のfor文を使うと、2次元配列のすべての要素を処理できる。
  • 拡張for文を使うと、インデックスを指定せずに要素を順番に処理できる。

多次元配列は、成績表や座席表など、行と列で整理されたデータを扱うときに役立ちます。まずは、行番号と列番号を指定して値を取り出す方法と、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となります。