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, 2。3は範囲外。
- 3列あるなら列インデックスは
- 範囲外アクセスに注意(例: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 → 二重ループの応用で「列ごとの平均」を計算。
