ループ(for / enhanced for / while) — 集合処理とレコードループ
同じ処理を繰り返すとき、Javaでは主に for、enhanced for(拡張 for)、while を使います。集合(配列・リスト)を順番に処理したり、入力を読み続けるなどの「ビジネスロジックの定番」に合わせて、初心者向けにかみ砕いて解説します。
基本の for 文
使いどころ
- 明確な回数: 何回繰り返すかが決まっている。
- インデックス操作: 配列やリストの添字を使いたい。
- 開始・終了・増分: ループの開始位置や増やし方を制御したい。
構文と流れ
for (初期化; 条件; 変化) {
// 繰り返す処理
}
Java- 初期化: 最初に一度だけ実行(例: int i = 0)。
- 条件: true の間くり返す(例: i < n)。
- 変化: 1周ごとに実行(例: i++)。
例:配列の先頭から末尾まで走査しながら更新
int[] scores = {70, 85, 90};
for (int i = 0; i < scores.length; i++) {
scores[i] += 5; // 5点加点
}
Javaよく使うパターン
// 0〜9を表示
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
// 逆順に処理
for (int i = scores.length - 1; i >= 0; i--) {
System.out.println(scores[i]);
}
// ステップを2ずつ
for (int i = 0; i < 10; i += 2) {
System.out.println(i); // 0,2,4,6,8
}
Javaenhanced for(拡張 for)— 仕分けや集計に最適
使いどころ
- 全件処理: コレクションや配列を“全部なめる”。
- インデックス不要: 位置より中身が大事なとき。
- 読みやすさ重視: 値の取り出しのみで十分な処理。
構文
for (要素型 変数 : 配列またはIterable) {
// 要素ごとの処理
}
Java例:売上リストの合計を出す
int[] sales = {1200, 980, 1530};
int total = 0;
for (int s : sales) {
total += s;
}
System.out.println(total);
Java注意点
- 添字が必要なら不向き: 位置が必要な処理(例: 2つの配列を同時に扱う)には普通の for。
- 要素の再代入は元データに反映されない: プリミティブや不変オブジェクトは、変数へ代入しても配列/リストの中身は変わらない。
while 文 — 条件が続く限り繰り返す
使いどころ
- 停止条件が可変: “条件が満たされるまで”処理したい。
- 入力待ち・ポーリング: 受信データがある間だけ読むなど。
- 回数が未定: 回数が決められないとき。
構文
while (条件) {
// 繰り返す処理
}
Java例:キューから取り出し続ける(空になったら終了)
import java.util.LinkedList;
import java.util.Queue;
Queue<String> q = new LinkedList<>();
q.add("A"); q.add("B"); q.add("C");
while (!q.isEmpty()) {
String item = q.poll();
System.out.println("処理: " + item);
}
Java無限ループと脱出
int retries = 0;
while (true) {
boolean ok = tryProcess(); // 仮の処理
if (ok) break; // 成功したら抜ける
if (++retries >= 3) break; // リトライ上限で抜ける
}
Javaループ制御(break / continue / ラベル)
よく使う制御
- break: ループを即終了。
- continue: 今回の周回をスキップして次へ。
- ラベル付き break: ネストした複数ループから一気に抜ける。
// continue で不正値をスキップ
for (int i = 0; i < 10; i++) {
if (i % 2 == 1) continue; // 奇数は飛ばす
System.out.println(i); // 偶数だけ出力
}
// ラベル付き break(多重ループを脱出)
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 2) break outer; // 外側ごと抜ける
}
}
Javaビジネスロジックの定番パターン
集合処理(フィルタ・変換・集計)
// フィルタ:3,000円以上だけ抜き出して合計
int[] prices = {1200, 3500, 8000, 2900};
int sum = 0;
for (int p : prices) {
if (p >= 3000) sum += p;
}
System.out.println("対象合計: " + sum);
Java// 変換:税率を適用して税込価格に
double[] net = {100.0, 250.0, 400.0};
double[] gross = new double[net.length];
for (int i = 0; i < net.length; i++) {
gross[i] = net[i] * 1.10; // 10% 税
}
Java// 集計:カテゴリ別の件数
String[] cats = {"FOOD","BOOK","OTHER","FOOD","OTHER"};
int food = 0, book = 0, other = 0;
for (String c : cats) {
if (c.equals("FOOD")) food++;
else if (c.equals("BOOK")) book++;
else other++;
}
Javaレコードループ(検証・加工・早期終了)
// ループ中で初の一致を見つけたら終わる(早期終了)
int[] ids = {12, 22, 35, 22, 50};
int target = 22;
int foundIndex = -1;
for (int i = 0; i < ids.length; i++) {
if (ids[i] == target) { foundIndex = i; break; }
}
System.out.println("最初の一致位置: " + foundIndex);
Java// 検証:不正データを数える(nullや空文字をスキップ)
String[] names = {"Sato", "", null, "Yamada"};
int invalid = 0;
for (String n : names) {
if (n == null || n.isEmpty()) { invalid++; continue; }
// 正常データの処理…
}
System.out.println("不正件数: " + invalid);
Java例題で身につける(解説つき)
例題1: 配列の最大値を求める
int[] a = {5, 2, 9, 4};
int max = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] > max) max = a[i];
}
System.out.println("最大値: " + max);
Java- ポイント: 初期値は先頭要素に。比較しながら更新。
例題2: 拡張 for で文字列を整形
String[] items = {"A", "B", "C"};
StringBuilder sb = new StringBuilder();
for (String it : items) {
sb.append("[").append(it).append("]");
}
System.out.println(sb.toString()); // [A][B][C]
Java- ポイント: 全件処理は拡張 for。結合は StringBuilder が効率的。
例題3: while で入力を読み続ける(疑似)
String[] inputs = {"ok", "ok", "stop", "ok"};
int i = 0;
while (i < inputs.length && !"stop".equals(inputs[i])) {
System.out.println("処理: " + inputs[i]);
i++;
}
Java- ポイント: 停止条件を先に書く。境界チェック+終了語の判定。
例題4: 二重ループで表の作成(breakの使いどころ)
for (int r = 1; r <= 3; r++) {
for (int c = 1; c <= 3; c++) {
if (r * c > 6) break; // 行の途中で打ち切り
System.out.print((r * c) + " ");
}
System.out.println();
}
Java- ポイント: 内側だけ抜ける breakで行単位の制御ができる。
テンプレート集(すぐ使える雛形)
回数指定ループ
for (int i = 0; i < N; i++) {
// i は 0..N-1
}
Java全件走査(配列・リスト)
for (Type x : collectionOrArray) {
// x を使った処理
}
Java条件継続ループ
while (condition) {
// 条件が true の間くり返す
}
Java検索+早期終了
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (predicate(arr[i])) { index = i; break; }
}
Javaスキップと脱出
for (Item it : items) {
if (!isValid(it)) continue;
process(it);
if (shouldStop(it)) break;
}
Java使い分けの目安とコツ
- 明確な回数・添字が必要: 通常の for。
- 全件処理で読みやすく: 拡張 for。
- 終わりが“条件次第”: while。
- スキップ・打ち切り: continue / break を適所に。
- 境界と条件は先に書く: 無限ループを避け、終了条件を見通しよく。
- 集計は初期値と更新が命: 合計は 0、最大・最小は“最初の要素”から。
