Java 逆引き集 | 配列(一次元・多次元) - 固定長データ処理

Java Java
スポンサーリンク

配列って何者か(「同じ型の箱」を並べたもの)

配列は「同じ型の値を、決まった個数だけ並べて持つための箱」です。 Java では「固定長データ」を扱うときの基本的なデータ構造で、int[]String[] のように書きます。 「何個あるか」が最初に決まり、その後は増えも減りもしない——この“固定長”という性質が、配列の一番の特徴です。

int[] scores = new int[3];  // 要素数3の int 配列
scores[0] = 80;
scores[1] = 90;
scores[2] = 75;
Java

インデックスは 0 から始まり、最後の要素は length - 1 番目です。 ここをきちんと押さえておくと、配列でつまずきにくくなります。

一次元配列(横一列に並んだデータ)

一次元配列の基本操作

一次元配列は「横一列に並んだ値の列」です。 宣言・代入・参照の流れを具体的に見てみましょう。

int[] scores = {80, 90, 75};  // 初期値付き宣言

System.out.println(scores[0]); // 80
System.out.println(scores[1]); // 90
System.out.println(scores[2]); // 75

System.out.println("要素数 = " + scores.length); // 3
Java

重要なのは次の2点です。

1つ目は「インデックスは 0 〜 length - 1」という範囲であること。 2つ目は「length プロパティで要素数を必ず確認する」こと。

これを守らないと、存在しないインデックスにアクセスして ArrayIndexOutOfBoundsException が発生します。

// NG例
System.out.println(scores[3]); // 要素数3なのに index=3 を読む → 例外
Java

「配列は 0 始まり」「上限は < length」をセットで覚えておくのが、初心者にとって一番大事なポイントです。

ループとの組み合わせ(固定長データ処理の基本形)

配列は「全要素を順番に処理する」場面でよく使われます。 for 文との組み合わせが、固定長データ処理の基本形です。

int[] scores = {80, 90, 75};
int sum = 0;

for (int i = 0; i < scores.length; i++) {
    sum += scores[i];
}

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

ここでは、

配列の外で集計用変数 sum を 0 で初期化する ループの中で scores[i] を1件ずつ足していく

というパターンになっています。 「固定長のデータを、最初から最後まで漏れなく処理する」というときに、この形が自然に出てくるようになると、配列を“使いこなしている”感覚に近づきます。

多次元配列(二次元配列)で「表」を表現する

二次元配列のイメージ

二次元配列は「配列の配列」です。 イメージとしては「行と列を持つ表(テーブル)」だと思うと分かりやすいです。

int[][] matrix = {
    {1, 2, 3},   // 0行目
    {4, 5, 6},   // 1行目
    {7, 8, 9}    // 2行目
};

System.out.println(matrix[0][0]); // 1
System.out.println(matrix[1][2]); // 6
System.out.println(matrix[2][1]); // 8
Java

matrix[行][列] という形でアクセスします。 「行ごとに配列を持っていて、その中に列の値が並んでいる」という構造です。

二次元配列と入れ子のループ

二次元配列を全件処理するときは、入れ子の for 文を使います。

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

for (int row = 0; row < matrix.length; row++) {
    for (int col = 0; col < matrix[row].length; col++) {
        System.out.print(matrix[row][col] + " ");
    }
    System.out.println();
}
Java

ここで重要なのは、

外側のループは「行」を回す(row < matrix.length) 内側のループは「その行の列」を回す(col < matrix[row].length

という構造になっていることです。 「配列の配列」なので、行ごとに列数が違うこともありえます。そのため、内側のループでは必ず matrix[row].length を使うのが安全です。

配列が「固定長」であることの意味

要素数は後から変えられない

配列は「作ったときに決めた要素数」がずっと変わりません。 途中で「やっぱり5個に増やしたい」と思っても、その配列自体の長さは変えられません。

int[] scores = new int[3];
// scores.length = 5; // こんなことはできない
Java

もし「もっと要素を増やしたい」なら、新しい配列を作って、古い配列から値をコピーする必要があります。

int[] oldScores = {80, 90, 75};
int[] newScores = new int[5];

for (int i = 0; i < oldScores.length; i++) {
    newScores[i] = oldScores[i];
}

newScores[3] = 60;
newScores[4] = 70;
Java

この「固定長」という性質があるからこそ、配列は「サイズが決まっているデータ」を扱うときに向いています。 逆に「増えたり減ったりするデータ」を扱いたいときは、List のような可変長コレクションを選ぶ方が自然です。

固定長データ処理の典型例

固定長データの例としては、

1週間分の売上(7日分) 1年分の月別データ(12ヶ月分) テストの科目数が決まっている点数配列

などがあります。

int[] monthlySales = new int[12]; // 12ヶ月分の売上

monthlySales[0] = 100;  // 1月
monthlySales[1] = 120;  // 2月
// ...
Java

「必ず12個ある」「必ず7個ある」といった前提があるなら、配列で持つとシンプルです。 その代わり、「何個あるか」が変わる可能性があるなら、最初から List を選んだ方が後で楽になります。

配列と他のコレクションの関係を意識する

配列は「素朴で速い」けれど柔軟性は低い

配列は言語レベルの基本機能なので、アクセスが速く、オーバーヘッドも少ないです。 ただし、「サイズが固定」「便利メソッドが少ない」という意味では、柔軟性は低めです。

一方、ListMap などのコレクションは、「サイズ可変」「豊富なメソッド」「ジェネリクスで型安全」といった利点がありますが、 内部で配列を使っていることが多く、その分のオーバーヘッドがあります。

初心者のうちは、

サイズが決まっていて、単純な処理だけなら配列 サイズが変わる、便利メソッドを使いたいなら List

くらいのざっくりした使い分けで十分です。 「このデータは固定長か?」「増えたり減ったりするか?」を自分に問いかけて、配列かコレクションかを選ぶ癖をつけると、設計の感覚が育っていきます。

まとめと小さな練習

配列は「同じ型の値を、決まった個数だけ並べて持つ」ための基本的な器で、 一次元配列は横一列の並び、二次元配列は行と列を持つ表のような構造です。 インデックスは 0 始まり、範囲は 0 〜 length - 1、サイズは固定——この3つをしっかり体に入れておくことが、配列を安全に使うための土台になります。

練習として、

一次元配列で「テストの点数3科目分」を持ち、合計と平均を計算する 二次元配列で「3×3の表」を作り、全要素を表示する

といったコードを自分で書いてみると、固定長データ処理の感覚がぐっと掴みやすくなるはずです。

タイトルとURLをコピーしました