ループの制御
while/do...while, for/拡張for命令ではあらかじめ決められた修了条件を満たしたタイミングでループを修了します。しかし、処理によっては、(修了条件に関わらず)特定の条件を満たしたところで強制的にループを中断したい、あるいは、特定の周回だけをスキップしたいということもあるでしょう。
Javaでは、このような場合に備えていくつかのループ制御命令を用意しています。
break命令
break命令は、現在のループ処理を強制的に中断する命令です。
具体例を見てみましょう。1~100の値を加算していき、合計値が1000を超えたところでループを脱出します。
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
int i;
int sum = 0;
for (i = 1; i <= 100; i++) {
sum += i;
if (sum > 1000) {
break;
}
}
System.out.println("合計金額が1000を超えるのは、1~" + i + "を加算したときです。");
}
}
実行結果
合計金額が1000を超えるのは、1~45を加算したときです。
この例のように、break命令はifのような条件分岐命令と合わせて利用するのが一般的です(無条件にbreakしてしまうと、そもそもループが1回しか実行されません)。
continue命令
ループそのものを完全に抜けてしまうbreak命令に対して、現在の集会だけをスキップし、ループそのものは継続して実行するのがcontinue命令の役割です。
次の例は、1~100の範囲で偶数値だけを加算し、その合計値を求めるサンプルです
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
var sum = 0;
for (var i = 0; i <= 100; i++) {
if (i % 2 != 0) {
continue;
}
sum += i;
}
System.out.println("合計値は" + sum + "です。");
}
}
実行結果
合計値は2550です。
このように、continue命令を用いることで、特定条件の下(ここではカウンター変数iが奇数のとき)で、現在の周回をスキップすることができます。
偶数/奇数の判定は、値が2で割離れるか(2で割った余りが0か)どうかで判定しています。よく利用する方法だそうなので覚えておくとよいそうです。
入れこのループを中断/スキップする
制御命令は互いに入れ子(ネスト)にできます。ネストされたループの中で、無条件にbreak/continue命令を使用した場合、内側のループだけを脱出/スキップします。
次の例は九九表を作成するためのサンプルです。ただし、格段ともに50を超えた値は表示しないものとします。
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
for (var i = 1; i < 10; i++) {
for (var j = 1; j < 10; j++) {
var result = i * j;
if (result > 50) {
break;
}
System.out.printf(" %2d", result);
}
System.out.println();
}
}
}
実行結果
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48
7 14 21 28 35 42 49
8 16 24 32 40 48
9 18 27 36 45
ここでは、変数result(カウンター変数iとjの積)が50を超えたところで、break命令を実行しています。これによって内側のループを脱出するので、結果として、積が50以下である九九表を出力できるわけです。
では、これを「値が一度でも50を超えたら、九九表そのものの出力を停止する」には、どのようにしたらよいでしょうか?これを表すのが次の例です。
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
limit: // limit:を定義する
for (var i = 1; i < 10; i++) {
for (var j = 1; j < 10; j++) {
var result = i * j;
if (result > 50) {
break limit; // breakの後にlimitをつける
}
System.out.printf(" %2d", result);
}
System.out.println();
}
}
}
実行結果
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48
「printf(" %2d", result)」は、変数resultを最低2桁で表示しなさい、という意味です(不測時は空白を補います)。