for 文の基本
このレッスンで分かること
for (初期化; 条件; 更新)の 3 つをセミコロン;で区切ります- ループ変数は慣習として
i、ネストするならjk- 最小例は
for (int i = 1; i <= n; i++) { result += i + " "; }
for 文の基本 とは
決まった回数を繰り返したいときの相棒、for 文を学ぼう。初期化・条件・更新の 3 つの式の意味を理解する。
for 文は「決まった回数」だけ繰り返す道具
プログラムを書いていると「同じ処理を 10 回繰り返したい」「リストの先頭から最後まで順番に見たい」という場面がしょっちゅう出てきます。そのたびに System.out.println(1); System.out.println(2); ... と手で並べるのは現実的ではありません。そこで登場するのが繰り返し構文、その中でも今回は for 文を学んでいきます。
プログラミング言語にはいくつかの繰り返し構文があり、
Javaには主にforwhiledo-whilefor-eachの 4 種類があります。その中でもfor文は「5回繰り返す」「1から100まで足す」のように 回数が決まっている ループに最も向いています。慣習として、競技プログラミングでも業務コードでも、回数決め打ちのループはまずforを考える、というのが Java の文化です。
試しに、1 から 5 まで順番に表示するコードを for なしで書くとこうなります。
Java
public class Solution {
public static void show() {
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
}
}5 回ならまだ書けますが、これが 100 回、1000 回になったら破綻します。for 文を使うと、同じことをたった 3 行で書けます。
Java
public class Solution {
public static void show() {
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
}
}「同じ形のことを繰り返す」をコンパクトに表現できる、これが for 文の魅力です。
for 文の文法 — 3 つの式を ; で区切る
Java の for 文の基本形は次のとおりです。
Java
for (初期化; 条件; 更新) {
// 繰り返したい処理
}丸カッコの中には、セミコロン ; で区切られた 3 つの式が並びます。それぞれの役目は次の通りです。
| 式 | タイミング | 例 |
|---|---|---|
| 初期化 | ループ開始前 1 回 | int i = 1 |
| 条件 | 毎回ループ前に評価 | i <= n |
| 更新 | 本体実行後に評価 | i++ |
さきほどの for (int i = 1; i <= 5; i++) を 3 つに分けると、int i = 1 が初期化、i <= 5 が条件、i++ が更新です。これで i は 1, 2, 3, 4, 5 と進み、6 になった瞬間に i <= 5 が false になってループを抜けます。
3 つの式を 必ずセミコロンで区切る のが Java の
for文のお作法です。カンマで区切ったり、セミコロンを忘れたりするとコンパイルエラーになります。
ループ変数は i、ネストするときは j k
ループのカウンタとなる変数名は、慣習的に i を使います。i は index の頭文字で、これは Java だけでなく C C++ JavaScript Python など、ほぼすべての言語で共通の文化です。
- 一重ループ —
iを使う - 二重ループ (内側のループ) —
jを使う - 三重ループ —
kを使う
もちろん count や index のような分かりやすい名前を付けてもエラーにはなりません。ただ、for のループ変数だけは「短くて読みやすい慣習名」のほうが好まれます。for (int row = 0; ...) for (int col = 0; ...) のように 意味のある名前 を付けたい場合は、意図がはっきり伝わるならそのほうがベターです。
「読みやすい変数名がよい」と聞いて、
for (int counterForLoop = 0; counterForLoop < 10; counterForLoop++)のような長い名前を付けたくなる人がいますが、forの中だけで完結する短命な変数はiで十分です。
文字列を for で連結する
今回の課題で必要になる、文字列の組み立てを for でやるパターンを見ておきましょう。1 から n までの数を空白区切りで連結する例です。
Java
public class Solution {
public static String countUp(int n) {
String result = "";
for (int i = 1; i <= n; i++) {
result += i + " ";
}
return result.trim();
}
}ポイントを順に見ていきます。
String result = "";で 空の文字列 を用意するresult += i + " ";で「数値 + 空白」を末尾に追加していく (iがintでも+ " "で文字列に変換される)- ループが終わると
resultは"1 2 3 4 5 "のように末尾に空白が 1 つ余分に付く return result.trim();で前後の余分な空白を取り除いて返す
もうひとつ、末尾の空白を出さないために「先頭以外で空白を入れる」というテクニックもあります。
Java
public class Solution {
public static String countUp(int n) {
String result = "";
for (int i = 1; i <= n; i++) {
if (i > 1) {
result += " ";
}
result += i;
}
return result;
}
}どちらも結果は同じです。読みやすいほうを選んでかまいません。
ちなみに大量の文字列を連結するときは
StringではなくStringBuilderを使うのが定石です。Stringは不変 (immutable) なので、+=のたびに新しい文字列が作られて非効率になります。とはいえ初学者のうちはString result = ""; result += ...で十分です。
実行フローを図で追ってみる
for の中で何が起きているのか、図で確認してみましょう。for (int i = 1; i <= 3; i++) が回るときの流れは次のとおりです。
図の流れを順序リストで書き直すと、次の通りです。
- 初期化
int i = 1を実行する (ループ前に 1 度) - 条件
i <= 3を評価する - 真であれば本体を実行する
- 更新
i++を実行する - 2 に戻る
- 偽であればループを抜ける
「初期化は最初の 1 回だけ」「条件 → 本体 → 更新 → 条件 → ...」とぐるぐる回っていく流れがイメージできるはずです。条件が false になった瞬間にループを抜ける、というのが大事なポイントです。
よくある間違い
for 文を使い始めるとき、初心者がほぼ全員ハマる落とし穴が 3 つあります。先に知っておけば回避できます。
- 区切り文字をカンマにしてしまう —
for (int i = 0, i < 10, i++)のようにカンマで区切るのは間違いで、正しくはセミコロン;です - 条件と更新を逆にして無限ループ —
for (int i = 0; i < 10; i--)のように更新が逆向きだとiが永遠に増えないので、ループが終わりません。chotdekiru の Java Playground では5秒の実行制限で強制終了されますが、本番環境ではCPUを食い続けてシステムが固まります - ループ変数をループの外で使ってしまう —
for (int i = 0; i < 10; i++)のiは丸カッコ内で宣言されているので、forブロックの外では使えません
無限ループは初心者にとっての最初の関門です。実行時間制限のある環境で練習しておくと、本番でも被害を最小限にできます。
もうひとつ、「for (int i = 0; i <= n; i++)」と「for (int i = 1; i <= n; i++)」のどちらにするか、「< か <= か」で迷うことがよくあります。これは 始まりの値 で決まります。0 から始めるなら配列の添字と相性がいいので i < n (n 回回る)、1 から人間にとって自然な数で数えるなら i <= n (これも n 回回る) と覚えておくと、書きながら迷わなくて済みます。
ここまでの要点
for (初期化; 条件; 更新) をセミコロンで区切る。ループ変数は i。末尾空白は trim() か「先頭以外でスペース」で処理する。
やってみよう
それでは今回の課題に取り組みましょう。やることは次の通りです。
Solution.countUp(int n)メソッドの中身を埋めるfor文を使って1からnまでの数を空白区切りでつなげた文字列を作るcountUp(3)が"1 2 3"、countUp(5)が"1 2 3 4 5"、countUp(1)が"1"になるかを確認する
注意点として、末尾に余分な空白を残さない こと。"1 2 3 " のように最後にスペースが残るとテストが fail します。trim() で取り除く方法と、if で先頭以外のときだけ空白を足す方法、どちらでも構いません。
余裕があれば、countUp(0) や countUp(-1) のような境界ケースで何が返るかも考えてみてください。今回のテストでは扱いませんが、実務では「想定外の入力で何が起きるか」を考える癖が役に立ちます。
このレッスンで for 文の骨格が分かれば、次は while 文や for-each 文、ネストしたループへと進んでいけます。手を動かして、for の 3 つの式が指のリズムに馴染むまで何回も書いてみましょう。
よくある質問
Q. for と while はどう使い分けますか?
A. 繰り返し回数や対象が決まっているなら for(リスト・range など)が読みやすく、終了条件が動的に決まるなら while を使います。例えば「100 回繰り返す」は for i in range(100):、「ユーザー入力が q になるまで」は while True + break が向いています。
Q. ループの途中で抜けたいときは?
A. break を使うとそのループを即座に終了します。次の周回に進みたいだけなら continue を使い、現在の処理だけスキップします。break / continue は読み手にとってジャンプ先が見えにくいため、関数化して return で抜けると意図が伝わりやすくなります。
Q. インデックスも一緒に取りたい場合は?
A. Python なら for i, v in enumerate(items):、JavaScript なら items.forEach((v, i) => ...) のようにインデックスを同時に取り出せます。手動で i = 0; i += 1 と書くと off-by-one のミスを誘発しやすいので、言語の標準機能を使うのが安全です。
次のレッスン
次は 1 から N までの合計 で、決まった回数を繰り返したいときの相棒、for 文を学ぼう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- for の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. for とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はcountUp、引数はint n1 つ、戻り値の型はString - 繰り返し処理には必ず
for文を使うこと (whileや再帰ではなく) - 末尾に余分な空白を入れないこと (
"1 2 3"であり"1 2 3 "ではない)
入出力例
test-cases.txt
countUp(3) → "1 2 3"
countUp(5) → "1 2 3 4 5"
countUp(1) → "1"