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

Java Java
スポンサーリンク

Javaの二次元配列の入門

まずは肩の力を抜いて。二次元配列は「表(行と列)の集まり」です。テーブルやエクセルの表を思い浮かべてください。行と列の交差点にある「マス」に値が入ります。


二次元配列の基礎イメージ

  • 二次元配列=配列の中に配列
    • 例:クラスのテスト点数を「生徒×科目」で表にする
  • 位置の指定は [行][列]
    • 行は「どの横の段か」、列は「その段のどの位置か」

作り方(初期化)の3つの方法

1) 中身も一緒に作る(最もわかりやすい)

int[][] scores = {
    {87, 54, 67}, // 1行目(生徒A:国語・数学・英語)
    {76, 92, 48}  // 2行目(生徒B:国語・数学・英語)
};
Java
  • ポイント: 行ごとに {} でまとめ、全体をさらに {} で包む。

2) まず「サイズ」だけ用意して、あとで詰める

int[][] scores = new int[2][3]; // 2行3列の表を用意(中身は全部0)

scores[0][0] = 87; // 1行目1列目
scores[0][1] = 54;
scores[0][2] = 67;
scores[1][0] = 76;
scores[1][1] = 92;
scores[1][2] = 48;
Java
  • ポイント: 作るときに行数と列数を指定。中身は後から入れる。

3) 既存の一次元配列を組み合わせる

int[] a = {87, 54, 67};
int[] b = {76, 92, 48};
int[][] scores = { a, b }; // 2行(a行・b行)の二次元配列を構成
Java
  • ポイント: 「行」を一次元配列として作り、それらを並べる。

使い方(取り出し・表示)

要素を取り出す

System.out.println(scores[0][1]); // 1行目の2列目 → 54
Java
  • ポイント: scores[行][列]。行・列は0から始まる(0,1,2,…)。

すべての要素を表示(基本の二重ループ)

for (int i = 0; i < scores.length; i++) {           // 行
    for (int j = 0; j < scores[i].length; j++) {    // 列
        System.out.println("scores[" + i + "][" + j + "] = " + scores[i][j]);
    }
}
Java
  • ポイント: scores.lengthは「行数」、scores[i].lengthは「その行の列数」。

実践例題で理解を深める

例題1:平均点を計算する(各生徒ごと)

目的:各行(生徒)について平均を出す。

int[][] scores = {
    {87, 54, 67}, // 生徒A
    {76, 92, 48}, // 生徒B
    {90, 81, 73}  // 生徒C
};

for (int i = 0; i < scores.length; i++) {
    int sum = 0;
    for (int j = 0; j < scores[i].length; j++) {
        sum += scores[i][j];
    }
    double avg = (double) sum / scores[i].length;
    System.out.println("生徒" + (char)('A' + i) + "の平均: " + avg);
}
Java
  • ポイント: 行ごとに合計して列数で割る。キャストで小数の平均に。

例題2:最高点を探す(全体)

目的:全マスの中で最大値とその位置を見つける。

int[][] scores = {
    {87, 54, 67},
    {76, 92, 48},
    {90, 81, 73}
};

int max = scores[0][0];
int maxRow = 0, maxCol = 0;

for (int i = 0; i < scores.length; i++) {
    for (int j = 0; j < scores[i].length; j++) {
        if (scores[i][j] > max) {
            max = scores[i][j];
            maxRow = i;
            maxCol = j;
        }
    }
}

System.out.println("最高点: " + max + "(行 " + maxRow + ", 列 " + maxCol + ")");
Java
  • ポイント: 最初の値で初期化。見つけたら更新と位置も記録。

例題3:不規則な「行ごとに列数が違う」配列(ジャグ配列)

目的:列数が行ごとに違っても扱えることを知る。

int[][] jagged = new int[3][]; // 行数だけ決める
jagged[0] = new int[]{1, 2};          // 2列
jagged[1] = new int[]{3, 4, 5};       // 3列
jagged[2] = new int[]{6};             // 1列

for (int i = 0; i < jagged.length; i++) {
    for (int j = 0; j < jagged[i].length; j++) {
        System.out.print(jagged[i][j] + " ");
    }
    System.out.println();
}
Java
  • ポイント: scores[i].lengthを使えば列数が違っても安全に回せる。

よくあるつまずきと回避法

  • インデックスは0から始まる
    • 3列あるなら列インデックスは 0, 1, 23は範囲外。
  • 範囲外アクセスに注意(例:ArrayIndexOutOfBoundsException)
    • 列の回し方は必ず scores[i].length を使う。固定値にしない。
  • 初期化の波括弧の入れ子ミス
    • 外側 {} が全体、内側 {} が行。カンマ位置も要確認。
  • nullの行に気づかない
    • new int[3][] とした場合、各行を new int[...] で作るのを忘れない。

ひと工夫:見やすく出力するヘルパー

public static void printMatrix(int[][] m) {
    for (int i = 0; i < m.length; i++) {
        System.out.print("[ ");
        for (int j = 0; j < m[i].length; j++) {
            System.out.print(m[i][j] + (j < m[i].length - 1 ? ", " : ""));
        }
        System.out.println(" ]");
    }
}
Java
  • ポイント: デバッグ時に配列の中身を一目で確認できる。

ミニ練習問題

  • 問題1: 2行4列の二次元配列を作り、すべてに「列番号×10」を入れて表示してください。
  • 問題2: ジャグ配列で、行ごとに列数が増える(1列、2列、3列…)配列を作成して表示してください。
  • 問題3: 点数表から「各科目(列)の平均」を計算して表示してください。

解答と解説

問題1:2行4列の二次元配列を作り、すべてに「列番号×10」を入れて表示

解答コード

public class Practice1 {
    public static void main(String[] args) {
        int[][] arr = new int[2][4]; // 2行4列の配列を作成

        // 値を代入(列番号×10)
        for (int i = 0; i < arr.length; i++) {          // 行ループ
            for (int j = 0; j < arr[i].length; j++) {   // 列ループ
                arr[i][j] = j * 10;
            }
        }

        // 表示
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}
Java

解説

  • new int[2][4] で「2行4列」の表を用意。
  • j * 10 で列番号に応じた値を入れる(0,10,20,30)。
  • 出力はこんな感じ: 0 10 20 30 0 10 20 30

問題2:ジャグ配列で、行ごとに列数が増える(1列、2列、3列…)

解答コード

public class Practice2 {
    public static void main(String[] args) {
        int[][] jagged = new int[3][]; // 行数だけ決める

        jagged[0] = new int[]{1};          // 1列
        jagged[1] = new int[]{2, 3};       // 2列
        jagged[2] = new int[]{4, 5, 6};    // 3列

        // 表示
        for (int i = 0; i < jagged.length; i++) {
            for (int j = 0; j < jagged[i].length; j++) {
                System.out.print(jagged[i][j] + " ");
            }
            System.out.println();
        }
    }
}
Java

解説

  • 「ジャグ配列」は行ごとに列数が違う配列。
  • new int[3][] で「3行あるけど列数は未定」と宣言。
  • 各行に別々の列数を割り当てる。
  • 出力は: 1 2 3 4 5 6

問題3:点数表から「各科目(列)の平均」を計算

解答コード

public class Practice3 {
    public static void main(String[] args) {
        int[][] scores = {
            {87, 54, 67}, // 生徒A
            {76, 92, 48}, // 生徒B
            {90, 81, 73}  // 生徒C
        };

        int numStudents = scores.length;       // 行数(生徒数)
        int numSubjects = scores[0].length;    // 列数(科目数)

        for (int j = 0; j < numSubjects; j++) {
            int sum = 0;
            for (int i = 0; i < numStudents; i++) {
                sum += scores[i][j]; // 科目ごとに合計
            }
            double avg = (double) sum / numStudents;
            System.out.println("科目" + (j+1) + "の平均: " + avg);
        }
    }
}
Java

解説

  • scores.length → 生徒数(行数)。
  • scores[0].length → 科目数(列数)。
  • 外側ループを「科目(列)」に、内側ループを「生徒(行)」にすると「列ごとの平均」が出せる。
  • 出力例: 科目1の平均: 84.33333333333333 科目2の平均: 75.66666666666667 科目3の平均: 62.666666666666664

まとめ

  • 問題1 → 行列の基本操作。[行][列] の理解。
  • 問題2 → ジャグ配列で「列数が違う」ケースを体験。
  • 問題3 → 二重ループの応用で「列ごとの平均」を計算。
タイトルとURLをコピーしました