初心者向けに「多次元配列(ここでは主に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. 宣言と初期化の基本パターン
- 宣言+初期化を同時に書く(簡単でおすすめ)
int[][] a = { {1,2,3}, {4,5,6} };
Java- 個々の配列を先に作ってまとめる
int[] row1 = {1,2,3};
int[] row2 = {4,5,6};
int[][] a = { row1, row2 };
Java- サイズだけ先に指定して後で値を入れる
int[][] a = new int[2][3]; // 2行3列、全要素は0で初期化される
a[0][0] = 10;
Javavarを使う(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このプログラムを動かすと、行ごとの合計と全体の合計・平均を計算して表示します。
練習問題 — 解答つき
int[][] a = { {1,2}, {3,4}, {5,6} };の行数と列数を答えよ。
解:行数=3、列数(各行)=2。- 次のコードの出力は何か?
int[][] a = { {1,2}, {3} };
System.out.println(a[1][0]);
Java解:3(行1の最初の要素)。注意:a[0][2] のような参照はエラーになる。
- 3×3 の配列
bをnew int[3][3]で作った後、対角線(左上→右下)の合計を求めるコードを書け。
解(例):
int sum = 0;
for (int i = 0; i < 3; i++) sum += b[i][i];
Java- ジャグ配列(行ごとに列数が違う)を作り、それぞれの行の長さを表示するプログラムを書け。
解(例):
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>>のようなコレクションで同じことをやってみる(サイズが動的に変わる)。 - 二次元配列で行列の足し算・掛け算を実装してみる(アルゴリズムの練習になる)。
