多次元配列の length をやさしく理解する
配列の「長さ」は、要素がいくつあるかを表します。Javaでは配列に用意されている length フィールドを見るだけでOKです。多次元配列の場合は「外側の配列の長さ」と「内側の配列の長さ」を分けて考えるのがコツです。
基本の考え方
- 外側の長さ:
array.lengthは「外側の配列の要素数(=行の数のイメージ)」です。 - 内側の長さ:
array[i].lengthは「i番目の内側の配列の要素数(=列の数のイメージ)」です。 - lengthはフィールド:
lengthはメソッドではなくフィールドなので()は不要です。array.lengthと書きます。
まずは1次元配列から
- 1次元の例:
int[] nums = {10, 20, 30, 40};
System.out.println(nums.length); // 4
Javaポイント: 要素が4つなので length は4。
2次元配列(表みたいなもの)
- 固定長の2次元配列:
int[][] table = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println(table.length); // 2 (行数)
System.out.println(table[0].length); // 3 (1行目の列数)
System.out.println(table[1].length); // 3 (2行目の列数)
Java- 入れ子ループで全部出力:
for (int i = 0; i < table.length; i++) { // 行を回す
for (int j = 0; j < table[i].length; j++) { // その行の列を回す
System.out.print(table[i][j] + " ");
}
System.out.println();
}
Java- ポイント:
- 外側が行数、内側が列数のイメージで、毎回
table[i].lengthを見ると安全です。 - 行によって列数が違っても、この書き方ならエラーになりにくいです。
- 外側が行数、内側が列数のイメージで、毎回
「段違い配列」(行ごとに長さが違う配列)
Javaの2次元配列は「行ごとに列数が違う」形も作れます。これを使うと「1行目は3つ、2行目は5つ」みたいな不揃いのデータも扱えます。
- 例:
int[][] ragged = new int[3][]; // 行数だけ決める(3行)
ragged[0] = new int[2]; // 1行目は2列
ragged[1] = new int[4]; // 2行目は4列
ragged[2] = new int[1]; // 3行目は1列
System.out.println(ragged.length); // 3
System.out.println(ragged[0].length); // 2
System.out.println(ragged[1].length); // 4
System.out.println(ragged[2].length); // 1
Java- 入れ子ループで安全に処理:
for (int i = 0; i < ragged.length; i++) {
for (int j = 0; j < ragged[i].length; j++) {
ragged[i][j] = i + j; // 例:何か代入
}
}
Java- ポイント:
- 各行の長さは必ず
ragged[i].lengthを見る。固定値で回すとエラーになります。
- 各行の長さは必ず
よくあるつまずきポイント
- 配列を初期化していない(null参照)
int[][] a = new int[2][]; // 内側はまだnull
// System.out.println(a[0].length); // ← NullPointerException
Java対策: a[0] = new int[3]; のように、内側の配列を作ってから length を参照します。
- 列数を外側のlengthで回してしまう
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) { // ← 誤り。列は a[i].length
// ...
}
}
Java- メソッド呼び出しと混同
nums.length(); // ← 誤り。lengthはフィールド
nums.length; // ← 正しい
Java練習問題と解説
例題1:2次元配列の合計を求める
- 課題: 行ごとに長さが異なる2次元配列
scoresの全要素の合計を計算してください。 - コード例:
int[][] scores = {
{80, 90},
{75, 85, 95},
{100}
};
int sum = 0;
for (int i = 0; i < scores.length; i++) {
for (int j = 0; j < scores[i].length; j++) {
sum += scores[i][j];
}
}
System.out.println("合計 = " + sum); // 525
Java- ポイント: 各行の列数が違うので、列は必ず
scores[i].lengthを使用。
例題2:最も長い行の長さを見つける
- 課題: 2次元配列
linesの中で、最も要素数が多い行の長さを求めて表示してください。 - コード例:
int[][] lines = {
{1, 2, 3},
{4},
{5, 6, 7, 8}
};
int maxLen = 0;
for (int i = 0; i < lines.length; i++) {
if (lines[i].length > maxLen) {
maxLen = lines[i].length;
}
}
System.out.println("最長行の長さ = " + maxLen); // 4
Java- ポイント: 比較対象は各行の
length。外側のlines.lengthは行数です。
例題3:表形式の表示(列そろえ)
- 課題: 2次元配列
tableを行ごとに表示。短い行は空白で埋めて列を揃えてください。 - コード例:
int[][] table = {
{1, 2, 3},
{4, 5},
{6, 7, 8, 9}
};
// まず最大列数を求める
int maxCols = 0;
for (int i = 0; i < table.length; i++) {
if (table[i].length > maxCols) {
maxCols = table[i].length;
}
}
// 揃えて表示
for (int i = 0; i < table.length; i++) {
for (int j = 0; j < maxCols; j++) {
if (j < table[i].length) {
System.out.printf("%2d ", table[i][j]);
} else {
System.out.printf(" "); // 足りない列は空白
}
}
System.out.println();
}
Java- ポイント: 表示用のループは最大列数
maxCols、値参照は各行のlengthをチェックして安全にアクセス。
まとめ
- 外側の
lengthは「行数」、内側のlengthは「各行の列数」というイメージで覚える。 - 段違い配列に強いのがJavaの2次元配列。各行ごとに
lengthを使えば、長さが違っても安全に処理できる。 lengthはフィールド。必ずarray.length/array[i].lengthの形で使う。
もっと練習したい場合は、「合計」「最大」「最小」「平均」「行の並び替え」などを length を活用して作ってみると理解が深まります。
