概要
繰り返し処理の制御構造について学んでいきましょう。
繰り返しには以下があります。
- while(条件に一致する間だけ繰り返す)
- do-while(一度必ず実行し、その後は条件に一致する間だけ繰り返す)
- for(条件に一致する間だけ繰り返す[繰り返し回数を指定可能])
また、繰り返しの最中に、ある条件に達したらループ処理から抜けたかったり、特定の条件のみスキップしたいということがあります。
その場合は以下を使います。
- break(ループ処理を終了する)
- continue(次のループに進む)
基本構文
while
()内の条件がTrueである限り、処理を行います。
whileの処理が1行の場合、{}(中カッコ)は省略できます。
これはdo-while、forについても同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// while int count = 0; while(count < 10) { System.out.println("count is " + count); count++; } // 省略構文 int otherCount = 0; while(otherCount < 10) System.out.println("otherCount is " + otherCount++); |
do-while
必ず最初の1回は処理が行われます。
そのあとにwhileの条件判定が行われ、Trueである間は繰り返されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// do-while int age = 10; do { System.out.println("age is " + age++); } while(age < 20); // 省略構文 int otherAge = 10; do System.out.println("otherAge is " + otherAge++); while(otherAge < 20); |
for
繰り返す回数を指定して処理を行う場合によく使います。
1 2 3 4 5 6 7 8 9 10 |
// for for (int i = 0; i < 10; i++) { System.out.println("i is " + i); } // 省略構文 for (int i = 0; i < 10; i++) System.out.println("i is " + i); |
拡張for
配列やCollection型(Listなど)をループで取得して扱うことを簡単にするための仕組みです。
for(型 格納変数名 : 配列またはCollection)を基本構文としています。
配列が空の場合、ループ処理は行われません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 拡張for // String型の配列(categories)を、String型の変数(category)に順次格納しています。 String[] categories = {"本", "衣類", "家電"}; for (String category: categories) { System.out.println("category is " + category); } //省略構文 for (String category: categories) System.out.println("category is " + category); // 配列が空の場合、ループ処理は行われません String[] clothes = {}; for (String cloth: clothes) { System.out.println("category is " + cloth); } |
break
繰り返し処理を途中で終了させることができます。
以下の場合、5で終了します。
1 2 3 4 5 6 7 |
// break for (int i = 0; i < 10; i++) { if(i == 5) break; System.out.println("i is " + i); } |
continue
処理を中断して、次のループに進みます。
以下の場合、偶数(割って0になる)はスキップしているので、奇数(英語でodd)のみが表示されます。
1 2 3 4 5 6 7 |
// continue for (int i = 0; i < 10; i++) { if(i % 2 == 0) continue;; System.out.println(i + " is odd"); } |
応用
多重ループ
繰り返し処理の中に繰り返し処理がある構造です。
以下の場合、iを1回繰り返す度に、jを9回実行しています。
iの繰り返し処理1回目 -> jの繰り返し処理が9回
iの繰り返し処理2回目 -> jの繰り返し処理が9回
・・・
結果的に、九九の結果が表示されます。
1 2 3 4 5 6 7 8 |
// 多重ル―プ for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { System.out.println("i * j = " + (i * j)); } } |
(コラム)
一覧の中に一覧があるような構造をもっている場合に使用することが多いです。
しかし、多重ループはコードが追いにくため、あまりお勧めしません。
将来的には、できるだけ多重ループにならないような設計ができることを目指しましょう。
無限ループ
終了条件が無い繰り返し処理です。
明示的に無限ループにする場合、whileの条件式を「true」にすることで可能です。
たまに、バグで無限ループに陥ってしまっていることもありますので、あまりに処理が重く終了しないということが起こったら、無限ループを疑ってみて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 無限ループ while(true) { System.out.println("無限ループ"); } // 無限ループ(バグ) // ループ回数が9回に達したら終了する想定だが、 // デクリメント(1ずつ減算)しているため終了しなくなっている。 int loopCount = 1; while(loopCount < 10) { System.out.println("ループ" + loopCount + "回目"); loopCount--; } |
(コラム)
無限ループの使いどころは、何らかの条件になって終了させるまでずっと動かし続けるためのだと思います。
私自身は業務で無限ループ自体を実装する機会にまだお目にかかったことはないので、あまり使うことはないものだと思っています。
ラベル
ラベルはbreakやcontinueの制御を移す箇所を指定できる目印です。
以下は九九の途中で制御を移すようにしています。
・jが偶数のときは処理しない
・i * jが10になるときはiのループに戻る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// ラベル i: for (int i = 1; i < 10; i++) { j: for (int j = 1; j < 10; j++) { if(j % 2 == 0) continue j; // jが偶数のときは処理しない if(i * j % 10 == 0) continue i; // i * jが10になるときはiのループに戻る System.out.println("i"+"["+ i +"] * j"+"["+ j +"] = " + (i * j)); } } // 処理結果 i[1] * j[1] = 1 i[1] * j[3] = 3 i[1] * j[5] = 5 i[1] * j[7] = 7 i[1] * j[9] = 9 i[2] * j[1] = 2 i[2] * j[3] = 6 i[3] * j[1] = 3 i[3] * j[3] = 9 i[3] * j[5] = 15 i[3] * j[7] = 21 i[3] * j[9] = 27 i[4] * j[1] = 4 i[4] * j[3] = 12 i[5] * j[1] = 5 i[5] * j[3] = 15 i[5] * j[5] = 25 i[5] * j[7] = 35 i[5] * j[9] = 45 i[6] * j[1] = 6 i[6] * j[3] = 18 i[7] * j[1] = 7 i[7] * j[3] = 21 i[7] * j[5] = 35 i[7] * j[7] = 49 i[7] * j[9] = 63 i[8] * j[1] = 8 i[8] * j[3] = 24 i[9] * j[1] = 9 i[9] * j[3] = 27 i[9] * j[5] = 45 i[9] * j[7] = 63 i[9] * j[9] = 81 |
(コラム)
実際には、繰り返し処理以外でも使用でき、returnやtry/throw(例外処理)にも指定できます。
しかし、コードが追いにくくなるため、多用することはお勧めできません。
もしJava Silverを受験するのであれば出題される可能性のある内容なので、理解しておくようにしましょう。
Java Silverを受験する場合は、黒本がおすすめです。
十分な練習問題と本番試験相当の総仕上げ問題が2回分あり、試験対策はこれだけで充分です。
まとめ
- 繰り返し処理には、while / do-while / for文がある。
- break, continueにより、繰り返し処理の途中でも終了したり、次のループを行わせることができる。
- 繰り返し処理には、多重ループと無限ループという使い方もある。
- ラベルは可読性が悪くなるので多用は避ける。