1. 概要

このチュートリアルでは、ループ内でbreakを使用するさまざまな方法を示すいくつかの例を作成します。 次に、breakをまったく使用せずにループを終了する方法についても説明します。

2. 問題

ネストされたループは、たとえば、リストのリストを検索する場合に非常に便利です。

一例として、学生のリストがあります。各学生には、計画されているコースのリストがあります。 コース0を計画した1人の名前を検索するとします。

まず、学生のリストをループします。 次に、そのループ内で、計画されているコースのリストをループします。

学生とコースの名前を印刷すると、次の結果が得られます。

student 0
  course 0
  course 1
student 1
  course 0
  course 1

コース0を計画した最初の学生を見つけたかったのです。 ただし、ループを使用するだけの場合、コースが見つかった後もアプリケーションは検索を続行します。

特定のコースを計画している人を見つけたら、検索を停止します。検索を続行すると、追加情報は必要ありませんが、より多くの時間とリソースが必要になります。 そのため、ネストされたループからを解除します。

3. 壊す

ネストされたループから抜け出す必要がある最初のオプションは、breakステートメントを使用することです。

String result = "";
for (int outerCounter = 0; outerCounter < 2; outerCounter++) {
    result += "outer" + outerCounter;
    for (int innerCounter = 0; innerCounter < 2; innerCounter++) {
        result += "inner" + innerCounter;
        if (innerCounter == 0) {
            break;
        }
    }
}
return result;

外側のループと内側のループがあり、両方のループに2つの反復があります。 内部ループのカウンターが0に等しい場合、breakコマンドを実行します。 この例を実行すると、次の結果が表示されます。

outer0inner0outer1inner0

または、コードを調整してもう少し読みやすくすることもできます。

outer 0
  inner 0
outer 1
  inner 0

これは私たちが欲しいものですか?

ほとんど、 内側のループはbreakステートメントで終了します 0が見つかった後。 ただし、外側のループは続きますが、 これは私たちが望んでいることではありません。 答えが出たらすぐに処理を完全に停止したいと思います。

4. ラベル付きの休憩

前の例は正しい方向への一歩でしたが、少し改善する必要があります。 ラベル付きブレークを使用してこれを行うことができます。

String result = "";
myBreakLabel:
for (int outerCounter = 0; outerCounter < 2; outerCounter++) {
    result += "outer" + outerCounter;
    for (int innerCounter = 0; innerCounter < 2; innerCounter++) {
        result += "inner" + innerCounter;
        if (innerCounter == 0) {
            break myBreakLabel;
        }
    }
}
return result;

ラベル付きのbreakは、内側のループだけでなく外側のループを終了します。ループの外側に myBreakLabel を追加し、breakステートメントをstop myBreakLabelに変更することでこれを実現します。 ]。 例を実行すると、次の結果が得られます。

outer0inner0

いくつかのフォーマットを使用すると、もう少し読みやすくなります。

outer 0
  inner 0

結果を見ると、内側のループと外側のループの両方が終了していることがわかります。これは私たちが達成したかったことです。

5. 戻る

別の方法として、 return ステートメントを使用して、結果が見つかったときに直接結果を返すこともできます。

String result = "";
for (int outerCounter = 0; outerCounter < 2; outerCounter++) {
    result += "outer" + outerCounter;
    for (int innerCounter = 0; innerCounter < 2; innerCounter++) {
        result += "inner" + innerCounter;
        if (innerCounter == 0) {
            return result;
        }
    }
}
return "failed";

ラベルが削除され、breakステートメントがreturnステートメントに置き換えられます。

上記のコードを実行すると、ラベル付きのブレークの場合と同じ結果が得られます。 この戦略が機能するためには、通常、ループのブロックを独自のメソッドに移動する必要があることに注意してください。

6. 結論

そのため、検索しているアイテムを見つけたときのように、ループを早期に終了する必要がある場合の対処方法を確認しました。 break キーワードは単一ループに役立ち、ネストされたループにはラベル付きのbreakを使用できます。

または、returnステートメントを使用することもできます。 returnを使用すると、ラベルのないブレークとラベルの付いたブレークの違いを考える必要がないため、コードが読みやすくなり、エラーが発生しにくくなります。

GitHubのコードを自由に見てください。