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.lengthとbingo[r].lengthを使えばサイズ変更に強い。
つまずきやすいポイントとコツ
- インデックスは0から: 1行目は
0、2列目は1。範囲外はエラーになる。 - サイズは固定: 作成後は行数・列数を変えられない。変えるなら新しい配列を作ってコピー。
- Nullに注意(段階作成時):
new int[行][]の直後は各行がnull。使う前に必ず各行をnew int[列]で作成。 - for文の順番: 外側が行、内側が列のループが基本形。可読性が上がる。
練習課題
- 表の合計値:
- お題:
int[][] a = {{1,2,3},{4,5,6}};の全要素の合計を求めて表示。 - ヒント: 外側は
a.length、内側はa[i].length。
- お題:
- 行ごとの最大値:
- お題: 各行の最大値を求めて「行0の最大=…, 行1の最大=…」と表示。
- ヒント: 行ごとに
maxを初期化して列ループで更新。
- 転置(行と列を入れ替え):
- お題:
m×nの配列をn×mに転置する新しい配列を作成して表示。 - ヒント: 転置先の
b[col][row] = a[row][col]。
- お題:
- ジャグ配列で段階作成:
- お題: 行数3で、列数が
2, 1, 4の配列を作って、各要素に行番号+列番号を代入して表示。 - ヒント: 行ごとに
new int[列数]を行い、2重ループで代入。
- お題: 行数3で、列数が
解答例と解説。
課題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[行][列]の「矩形配列」。 - 行ごとに列数が違うデータ: 段階作成の「ジャグ配列」。
- 読みやすさを重視: 行を外側、列を内側にしてループ・アクセスを統一。
