Javaで入れ子になっている外側のループから出る方法

こんにちは、さるまりんです。

入れ子になっている内側のループで条件が満たされたら外側のループからも出て処理を終了する方法です。

こんなプログラムを書きました。

public class Test {
	public static void main(String[] args) {
		int total = 0;
		for(int i = 1; i < 10; i++) {
			for (int j = 10; j > 0; j--) {
				total += (i * j);
				System.out.println("現在の合計 " + total + " i : " + i + ", j : " + j);
				if(total > 1000) {
					break;
				}
			}
		}
	}
}

意図としてはijをかけて加算していった値の合計が1000を超えたところで止めたいということなのですがこれでは思ったように止まらずに次のような結果となります。

現在の合計 10 i : 1, j : 10
現在の合計 19 i : 1, j : 9
現在の合計 27 i : 1, j : 8
現在の合計 34 i : 1, j : 7
現在の合計 40 i : 1, j : 6
現在の合計 45 i : 1, j : 5
現在の合計 49 i : 1, j : 4
現在の合計 52 i : 1, j : 3
現在の合計 54 i : 1, j : 2
現在の合計 55 i : 1, j : 1
現在の合計 75 i : 2, j : 10
現在の合計 93 i : 2, j : 9
現在の合計 109 i : 2, j : 8
現在の合計 123 i : 2, j : 7
現在の合計 135 i : 2, j : 6
現在の合計 145 i : 2, j : 5
現在の合計 153 i : 2, j : 4
現在の合計 159 i : 2, j : 3
現在の合計 163 i : 2, j : 2
現在の合計 165 i : 2, j : 1
現在の合計 195 i : 3, j : 10
現在の合計 222 i : 3, j : 9
現在の合計 246 i : 3, j : 8
現在の合計 267 i : 3, j : 7
現在の合計 285 i : 3, j : 6
現在の合計 300 i : 3, j : 5
現在の合計 312 i : 3, j : 4
現在の合計 321 i : 3, j : 3
現在の合計 327 i : 3, j : 2
現在の合計 330 i : 3, j : 1
〜略〜
現在の合計 885 i : 6, j : 10
現在の合計 939 i : 6, j : 9
現在の合計 987 i : 6, j : 8
現在の合計 1029 i : 6, j : 7
現在の合計 1099 i : 7, j : 10
現在の合計 1179 i : 8, j : 10
現在の合計 1269 i : 9, j : 10

1000以上の値が複数表示されてますね。

期待する動作は合計が1029になったところで処理が終わることです。

これは条件が満たされた時内側のループ(jをカウントダウンしているループ)からのみbreakしているからなので、外側のループから出るようにします。

ラベルとbreakで外側のループを抜ける

方法はループにラベルをつけ、breakでそのラベルを指定します。

ラベル:
for(外側のループ) {
	for (内側のループ) {
		if(条件) {
			break ラベル;
		}
	}
}

上のプログラムを書き換えると次のようになります。

public class Test {
	public static void main(String[] args) {
		int total = 0;
		outerloop:
		for(int i = 1; i < 10; i++) {
			for (int j = 10; j > 0; j--) {
				total += (i * j);
				System.out.println("現在の合計 " + total + " i : " + i + ", j : " + j);
				if(total > 1000) {
					break outerloop;
				}
			}
		}
	}
}

実行すると以下を出力します。

現在の合計 10 i : 1, j : 10
現在の合計 19 i : 1, j : 9
現在の合計 27 i : 1, j : 8
現在の合計 34 i : 1, j : 7
現在の合計 40 i : 1, j : 6
現在の合計 45 i : 1, j : 5
現在の合計 49 i : 1, j : 4
現在の合計 52 i : 1, j : 3
現在の合計 54 i : 1, j : 2
現在の合計 55 i : 1, j : 1
現在の合計 75 i : 2, j : 10
現在の合計 93 i : 2, j : 9
現在の合計 109 i : 2, j : 8
現在の合計 123 i : 2, j : 7
現在の合計 135 i : 2, j : 6
現在の合計 145 i : 2, j : 5
現在の合計 153 i : 2, j : 4
現在の合計 159 i : 2, j : 3
現在の合計 163 i : 2, j : 2
現在の合計 165 i : 2, j : 1
現在の合計 195 i : 3, j : 10
現在の合計 222 i : 3, j : 9
現在の合計 246 i : 3, j : 8
現在の合計 267 i : 3, j : 7
現在の合計 285 i : 3, j : 6
現在の合計 300 i : 3, j : 5
現在の合計 312 i : 3, j : 4
現在の合計 321 i : 3, j : 3
現在の合計 327 i : 3, j : 2
現在の合計 330 i : 3, j : 1
〜略〜
現在の合計 885 i : 6, j : 10
現在の合計 939 i : 6, j : 9
現在の合計 987 i : 6, j : 8
現在の合計 1029 i : 6, j : 7

期待通り止まってくれました!

ラベルは:で終わり、breakの次に指定する。

構文は何度も使って覚えると自分のものになるかな。

頑張ります。

読んでくださってありがとうございます。

それではまた!