ラベル付きbreak
外側のループを適切に終了します。
「ラベル付きbreak」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
ネストされたループの問題
通常の break で終了できるのは内側のループだけです。しかし、多くの場合は両方のループから同時に抜けたいことがあります。
グリッドから1つの値を検索する場面を考えてみましょう。値が見つかったら、内側のループだけでなく、すべての処理を停止したいはずです。
Java では、これをラベル付き breakで解決できます。
ラベルとは
ラベルとは、ループに付ける名前で、名前の後ろにコロンを置きます。
たとえば for ループの直前に outer: と書くと、そのループに「outer」という名前が付きます。
ラベルだけでは何も起こりません。break や continue と組み合わせることで役立ちます。
outer:
for (int i = 0; i < 3; i++) {
// 'outer' is now a name for this loop
}ラベル付き break の構文
break キーワードの後ろにラベル名を書きます。break outer;
これにより、ネストされたループの深い位置からでも、Java は outer という名前のループの外へ移動します。
内側と外側の両方のループが直ちに停止します。
break outer; // exits the loop labeled 'outer'ラベル付き break の動作
ここでは 3×3 のグリッドを検索します。行 2 の col 2 が見つかったら、外側のループから抜けます。
通常の break とは異なり、これにより両方のループが同時に停止します。
public class Main {
public static void main(String[] args) {
outer:
for (int row = 1; row <= 3; row++) {
for (int col = 1; col <= 3; col++) {
if (row == 2 && col == 2) {
System.out.println("Found at " + row + "," + col);
break outer;
}
}
}
System.out.println("Search over");
}
}すべての処理が停止した理由
出力は「Found at 2,2」、続いて「Search over」でした。
break outer と指定したため、両方のループが終了しました。行 3 は一度も処理されていません。
通常の break では、内側のループだけを終了した後、行 3 へ進んでいたでしょう。
2つの break の比較
同じグリッドで、代わりに通常の break を使った場合を見てみましょう。
通常の break では内側のループだけから抜けるため、外側のループはすべての行を進み続けます。
public class Main {
public static void main(String[] args) {
for (int row = 1; row <= 3; row++) {
for (int col = 1; col <= 3; col++) {
if (row == 2 && col == 2) {
break;
}
System.out.println(row + "," + col);
}
}
}
}2次元配列の検索
実際の用途の1つは、行列の中から対象の値を見つけることです。
値が見つかったら、ラベル付き break によって検索全体をきれいに終了できます。
public class Main {
public static void main(String[] args) {
int[][] grid = {{1, 2}, {3, 9}, {5, 6}};
int target = 9;
search:
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
if (grid[r][c] == target) {
System.out.println("At row " + r + " col " + c);
break search;
}
}
}
}
}ラベルはループに付ける必要がある
ラベルは、その名前が付くループの直前に置きます。囲んでいるループに付いていないラベルへ break することはできません。
outer、rows、search のように、コードの意図が自然に伝わる明確な名前を選んでください。
意図が分かりにくい x: のような名前は避けましょう。
3段階のネスト
ラベルは、3つ以上のループがネストされている場合にも使えます。
ここでは、条件を満たしたときにラベル付き break で3つすべてのループから一度に抜けます。
public class Main {
public static void main(String[] args) {
done:
for (int a = 1; a <= 2; a++) {
for (int b = 1; b <= 2; b++) {
for (int c = 1; c <= 2; c++) {
if (a + b + c == 4) {
System.out.println(a + "," + b + "," + c);
break done;
}
}
}
}
}
}ラベル付き break が役立つ場合
ラベル付き break は、結果が見つかった瞬間に複数のループを中止する必要がある場合に効果を発揮します。
各レベルで確認する boolean found のような追加のフラグ変数を避けられます。
使いすぎなければ、検索ループを短く明確に保てます。
控えめに使う
強力な機能ですが、ラベルが多すぎるとコードを追いにくくなります。
ラベル付き break は、主に実際にネストされた検索で使いましょう。単純なループでは、通常の break のほうが明快です。
常に読みやすさを優先してください。
理解度チェック
ネストされたループでラベル付き break が何をするか考えてみましょう。
まとめ
ラベルはループに名前を付け、break label; はその名前付きループを終了して、その内側にネストされたすべてのループから抜けます。
これは、ネストされた検索全体を一度に停止するのに適しています。次は、ラベルと continue の組み合わせについて学びます。
よくある質問
「ラベル付きbreak」レッスンは無料ですか?
はい。「ラベル付きbreak」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「ラベル付きbreak」で何を学びますか?
外側のループを適切に終了します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ラベル付きbreak」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。