Java | 多次元配列(2次元配列)の作り方と使い方

Java Java
スポンサーリンク

初心者向けに「多次元配列(ここでは主に2次元配列)」をやさしく噛み砕き、分かりやすい例題(解説+コード+実行例)を交えて詳しく説明します。順を追って進めるので、必要ならコードをコピーして動かしてみてください。

1. イメージ:表(行と列)

2次元配列は「表」のようなものです。

  • 「行(row)」がいくつあるか → 最初の [](例:int[][] a の左側)
  • 各行の「列(column)」がいくつあるか → 2つ目の []

例:

int[][] a = {
  {1, 2, 3},   // 行0
  {4, 5, 6}    // 行1
};
Java

これは 2行3列の表(2×3)です。a[0][2] は「行0の列2」→ 3 を指します。


2. 宣言と初期化の基本パターン

  1. 宣言+初期化を同時に書く(簡単でおすすめ)
int[][] a = { {1,2,3}, {4,5,6} };
Java
  1. 個々の配列を先に作ってまとめる
int[] row1 = {1,2,3};
int[] row2 = {4,5,6};
int[][] a = { row1, row2 };
Java
  1. サイズだけ先に指定して後で値を入れる
int[][] a = new int[2][3]; // 2行3列、全要素は0で初期化される
a[0][0] = 10;
Java
  1. var を使う(Java 10+ の型推論)
var a = new int[][] { {1,2}, {3,4} };
Java

※ 初心者はまず型を明示して書くのが分かりやすいです。


3. 要素の読み書き(添字の順序)

  • a[i][j]i が行、j が列
  • 添字は 0 から始まる(最初の行は 0、最初の列も 0
  • 配列外を参照すると ArrayIndexOutOfBoundsException が出るので注意

4. 要素を処理する典型パターン(二重ループ)

2次元配列の中身を順に処理するには二重 for が基本です。

for (int i = 0; i < a.length; i++) {          // 行ループ
    for (int j = 0; j < a[i].length; j++) {   // 列ループ(各行の長さ)
        System.out.println("a[" + i + "][" + j + "] = " + a[i][j]);
    }
}
Java

ポイント:a.length は行数、a[i].length は行 i の列数(※行ごとに列数が違う“ジャグ配列”にも対応)。


5. 注意点:行ごとに長さが違う(ジャグ配列)

2次元配列は「必ず全行が同じ列数」というわけではありません。次のように行ごとに列数が違う配列を作れます。

int[][] a = new int[3][]; // 行は3つあるが、各行の長さは未設定
a[0] = new int[]{1,2};
a[1] = new int[]{3,4,5};
a[2] = new int[]{6};
Java

この場合、行ごとに a[i].length を参照することが重要です。


例題:詳しい解説+コード(初心者向け)

例題1 — 全要素を表示する(基本)

問題:以下の配列のすべての要素を num[i][j] = 値 の形式で表示してください。

int[][] num = { {87,54,67}, {76,92,48} };
Java

解答(サンプル実行プログラム):

class Example1 {
  public static void main(String[] args) {
    int[][] num = { {87,54,67}, {76,92,48} };
    for (int i = 0; i < num.length; i++) {
      for (int j = 0; j < num[i].length; j++) {
        System.out.println("num[" + i + "][" + j + "] = " + num[i][j]);
      }
    }
  }
}
Java

実行結果(出力):

num[0][0] = 87
num[0][1] = 54
num[0][2] = 67
num[1][0] = 76
num[1][1] = 92
num[1][2] = 48

例題2 — 行ごと(各行)の合計を求める

問題:上の num 配列について、各行の合計を求めて表示してください。

解答:

class Example2 {
  public static void main(String[] args) {
    int[][] num = { {87,54,67}, {76,92,48} };
    for (int i = 0; i < num.length; i++) {
      int sum = 0;
      for (int j = 0; j < num[i].length; j++) {
        sum += num[i][j];
      }
      System.out.println("row " + i + " sum = " + sum);
    }
  }
}
Java

実行結果:

row 0 sum = 208
row 1 sum = 216

例題3 — 全要素の平均(全体の平均値)

問題:配列全体の平均を小数で表示してください。

解答:

class Example3 {
  public static void main(String[] args) {
    int[][] num = { {87,54,67}, {76,92,48} };
    int total = 0;
    int count = 0;
    for (int i = 0; i < num.length; i++) {
      for (int j = 0; j < num[i].length; j++) {
        total += num[i][j];
        count++;
      }
    }
    double average = (double) total / count;
    System.out.println("Total = " + total + ", Count = " + count + ", Average = " + average);
  }
}
Java

実行結果:

Total = 424, Count = 6, Average = 70.66666666666667

例題4 — ユーザー入力で2次元配列を作る(ミニアプリ)

説明:ユーザーから行数・列数・要素を入力して、合計と平均を出す簡単なコンソールアプリです。Scanner を使います。

import java.util.Scanner;

class MiniApp {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("行数を入力してください: ");
    int rows = sc.nextInt();
    System.out.print("列数を入力してください: ");
    int cols = sc.nextInt();

    int[][] table = new int[rows][cols];
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
        System.out.print("table[" + i + "][" + j + "] を入力: ");
        table[i][j] = sc.nextInt();
      }
    }

    int total = 0, count = 0;
    for (int i = 0; i < rows; i++) {
      int rowSum = 0;
      for (int j = 0; j < cols; j++) {
        rowSum += table[i][j];
      }
      System.out.println("行 " + i + " の合計: " + rowSum);
      total += rowSum;
      count += cols;
    }

    double average = (double) total / count;
    System.out.println("全体の合計: " + total);
    System.out.println("全体の平均: " + average);
    sc.close();
  }
}
Java

このプログラムを動かすと、行ごとの合計と全体の合計・平均を計算して表示します。


練習問題 — 解答つき

  1. int[][] a = { {1,2}, {3,4}, {5,6} }; の行数と列数を答えよ。
    解:行数=3、列数(各行)=2。
  2. 次のコードの出力は何か?
int[][] a = { {1,2}, {3} };
System.out.println(a[1][0]);
Java

解:3(行1の最初の要素)。注意:a[0][2] のような参照はエラーになる。

  1. 3×3 の配列 bnew int[3][3] で作った後、対角線(左上→右下)の合計を求めるコードを書け。
    解(例):
int sum = 0;
for (int i = 0; i < 3; i++) sum += b[i][i];
Java
  1. ジャグ配列(行ごとに列数が違う)を作り、それぞれの行の長さを表示するプログラムを書け。
    解(例):
int[][] a = { {1,2,3}, {4,5}, {6} };
for (int i = 0; i < a.length; i++) {
  System.out.println("row " + i + " length = " + a[i].length);
}
Java

よくあるつまずきポイント(初心者が間違いやすいところ)

  • 添字を 1 始まりで考えてしまう(Java は 0 始まり)。
  • 列数が行ごとに違う場合に a[0].length を固定で使ってしまい ArrayIndexOutOfBoundsException が出る。→ 各行で a[i].length を使う。
  • new int[rows][cols]new int[rows][] の違いを理解していない(後者は行ごとに列を別途割り当てるジャグ配列)。

次のステップ(おすすめ)

  • 3次元配列(配列の配列の配列)を試してみる(イメージは「立体」)。
  • 配列ではなく ArrayList<ArrayList<Integer>> のようなコレクションで同じことをやってみる(サイズが動的に変わる)。
  • 二次元配列で行列の足し算・掛け算を実装してみる(アルゴリズムの練習になる)。
タイトルとURLをコピーしました