Java | 多次元配列(2次元配列)

Java Java
スポンサーリンク

Java の多次元配列(2次元配列)を初心者向けにわかりやすく

はじめての多次元配列は「表(行と列)」をイメージするとつかみやすいです。まずは2次元配列だけに絞って、宣言から代入、取り出し、ループまで例題で丁寧に説明します。


多次元配列のイメージ

  • 表のイメージ: 2次元配列は「行」と「列」を持つ表。たとえば3行×4列の点数表。
  • アクセス方法: 配列名[行][列] で指定する。行が先、列が後。
  • サイズの意味: new int[行数][列数]。行が縦、列が横。

例:scores[1][2] は「2行目の3列目」を指す(インデックスは0スタート)。


宣言と作成の基本

  • 2次元配列の宣言:
int[][] scores;
Java
  • まとめて作成(行と列を同時に用意):
scores = new int[3][4]; // 3行×4列
Java
  • 段階的に作成(ジャグ配列=行ごとに列数が違う形も可):
int[][] seats = new int[3][]; // 3行ぶんの外側だけ作る
seats[0] = new int[2];        // 1行目は2列
seats[1] = new int[4];        // 2行目は4列
seats[2] = new int[3];        // 3行目は3列
Java

値の代入と取り出し

  • 単発の代入:
scores[0][0] = 80; // 1行目1列目
scores[0][1] = 90; // 1行目2列目
scores[2][3] = 75; // 3行目4列目
Java
  • 取り出して使う(表示など):
System.out.println(scores[0][1]); // 90
Java

例題で理解を深める

例題1:点数表(3科目×4人)の平均を計算

public class Main {
    public static void main(String[] args) {
        // 3科目(行)×4人(列)
        int[][] scores = {
            {80, 90, 70, 60}, // 国語
            {75, 85, 95, 50}, // 数学
            {90, 60, 80, 70}  // 英語
        };

        // 科目ごとの平均(行の平均)
        for (int subject = 0; subject < scores.length; subject++) {
            int sum = 0;
            for (int student = 0; student < scores[subject].length; student++) {
                sum += scores[subject][student];
            }
            double avg = (double) sum / scores[subject].length;
            System.out.println("科目" + subject + "の平均: " + avg);
        }

        // 人ごとの平均(列の平均)
        for (int student = 0; student < scores[0].length; student++) {
            int sum = 0;
            for (int subject = 0; subject < scores.length; subject++) {
                sum += scores[subject][student];
            }
            double avg = (double) sum / scores.length;
            System.out.println("生徒" + student + "の平均: " + avg);
        }
    }
}
Java
  • ポイント:
    • 行のループ: scores.length は行数。
    • 列のループ: scores[行].length はその行の列数(ジャグ配列でも安全)。
    • 型変換: 平均を小数で出すために (double) sum

例題2:座席表の表示(ジャグ配列)

public class Main {
    public static void main(String[] args) {
        int[][] seats = new int[3][];
        seats[0] = new int[]{1, 2};       // 1列目は2席
        seats[1] = new int[]{1, 2, 3, 4}; // 2列目は4席
        seats[2] = new int[]{1, 2, 3};    // 3列目は3席

        for (int row = 0; row < seats.length; row++) {
            System.out.print("列" + row + ": ");
            for (int col = 0; col < seats[row].length; col++) {
                System.out.print(seats[row][col] + " ");
            }
            System.out.println();
        }
    }
}
Java
  • ポイント:
    • ジャグ配列: 行ごとに列数が異なる。
    • 安全な列ループ: seats[row].length を毎行使う。

例題3:ビンゴカード(5×5)にランダム値を入れて表示

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int[][] bingo = new int[5][5];
        Random rand = new Random();

        // 値をランダムに代入(1〜99)
        for (int r = 0; r < bingo.length; r++) {
            for (int c = 0; c < bingo[r].length; c++) {
                bingo[r][c] = rand.nextInt(99) + 1;
            }
        }

        // 表示(整形)
        for (int r = 0; r < bingo.length; r++) {
            for (int c = 0; c < bingo[r].length; c++) {
                System.out.printf("%2d ", bingo[r][c]);
            }
            System.out.println();
        }
    }
}
Java
  • ポイント:
    • printf の活用: 桁を揃えて見やすく表示。
    • サイズの一般化: bingo.lengthbingo[r].length を使えばサイズ変更に強い。

つまずきやすいポイントとコツ

  • インデックスは0から: 1行目は 0、2列目は 1。範囲外はエラーになる。
  • サイズは固定: 作成後は行数・列数を変えられない。変えるなら新しい配列を作ってコピー。
  • Nullに注意(段階作成時): new int[行][] の直後は各行が null。使う前に必ず各行を new int[列] で作成。
  • for文の順番: 外側が行、内側が列のループが基本形。可読性が上がる。

練習課題

  1. 表の合計値:
    • お題: int[][] a = {{1,2,3},{4,5,6}}; の全要素の合計を求めて表示。
    • ヒント: 外側は a.length、内側は a[i].length
  2. 行ごとの最大値:
    • お題: 各行の最大値を求めて「行0の最大=…, 行1の最大=…」と表示。
    • ヒント: 行ごとに max を初期化して列ループで更新。
  3. 転置(行と列を入れ替え):
    • お題: m×n の配列を n×m に転置する新しい配列を作成して表示。
    • ヒント: 転置先の b[col][row] = a[row][col]
  4. ジャグ配列で段階作成:
    • お題: 行数3で、列数が 2, 1, 4 の配列を作って、各要素に 行番号+列番号 を代入して表示。
    • ヒント: 行ごとに new int[列数] を行い、2重ループで代入。

解答例と解説。

課題1:表の合計値

問題:

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

この配列の全要素の合計を求める。

解答例:

public class Main {
    public static void main(String[] args) {
        int[][] a = {{1,2,3},{4,5,6}};
        int sum = 0;

        for (int i = 0; i < a.length; i++) {          // 行ループ
            for (int j = 0; j < a[i].length; j++) {   // 列ループ
                sum += a[i][j];
            }
        }

        System.out.println("合計 = " + sum);
    }
}
Java

解説:

  • a.length → 行数(ここでは2)。
  • a[i].length → 各行の列数。
  • 2重ループで全要素を走査して合計。
  • 結果は 1+2+3+4+5+6 = 21

課題2:行ごとの最大値

問題: 各行の最大値を求めて表示。

解答例:

public class Main {
    public static void main(String[] args) {
        int[][] a = {{1,2,3},{4,5,6}};

        for (int i = 0; i < a.length; i++) {
            int max = a[i][0]; // その行の最初の値で初期化
            for (int j = 1; j < a[i].length; j++) {
                if (a[i][j] > max) {
                    max = a[i][j];
                }
            }
            System.out.println("行" + i + "の最大値 = " + max);
        }
    }
}
Java

解説:

  • 各行ごとに max を初期化。
  • 列ループで比較しながら最大値を更新。
  • 出力は「行0の最大=3」「行1の最大=6」。

課題3:転置(行と列を入れ替え)

問題: m×n の配列を n×m に転置。

解答例:

public class Main {
    public static void main(String[] args) {
        int[][] a = {
            {1, 2, 3},
            {4, 5, 6}
        }; // 2行×3列

        int[][] b = new int[a[0].length][a.length]; // 3行×2列

        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                b[j][i] = a[i][j]; // 転置
            }
        }

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

解説:

  • 元配列 a は 2×3。転置後は 3×2。
  • 転置の式は b[j][i] = a[i][j]
  • 出力は: 1 4 2 5 3 6

課題4:ジャグ配列で段階作成

問題: 行数3で列数が 2, 1, 4 の配列を作り、各要素に「行番号+列番号」を代入して表示。

解答例:

public class Main {
    public static void main(String[] args) {
        int[][] jagged = new int[3][];
        jagged[0] = new int[2];
        jagged[1] = new int[1];
        jagged[2] = new int[4];

        for (int i = 0; i < jagged.length; i++) {
            for (int j = 0; j < jagged[i].length; j++) {
                jagged[i][j] = i + j; // 行番号+列番号
            }
        }

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

解説:

  • ジャグ配列は「行ごとに列数が違う」配列。
  • 各行を new int[列数] で作成。
  • 値は i+j で代入。
  • 出力例: 行0: 0 1 行1: 1 行2: 2 3 4 5

まとめ

  • 課題1: 2重ループで合計。
  • 課題2: 行ごとに最大値を更新。
  • 課題3: 転置は b[j][i] = a[i][j]
  • 課題4: ジャグ配列は行ごとに列数を指定して作成。

使い分けの考え方

  • 表のように均一なサイズが欲しい: new int[行][列] の「矩形配列」。
  • 行ごとに列数が違うデータ: 段階作成の「ジャグ配列」。
  • 読みやすさを重視: 行を外側、列を内側にしてループ・アクセスを統一。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました