Java 逆引き集 | ループ(for / enhanced for / while) — 集合処理とレコードループ

Java Java
スポンサーリンク

ループ(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
}
Java

enhanced 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、最大・最小は“最初の要素”から。

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