web-dev-qa-db-ja.com

ダブル/ネストされたループでメイン/外部ループから抜けるにはどうすればよいですか?

ループ内にループがあり、ifステートメントが満たされたら、メインループを解除したいのですが、どうすればよいですか?

これは私のコードです:

for (int d = 0; d < amountOfNeighbors; d++) {
    for (int c = 0; c < myArray.size(); c++) {
        if (graph.isEdge(listOfNeighbors.get(d), c)) {
            if (keyFromValue(c).equals(goalWord)) { // Once this is true I want to break main loop.
                System.out.println("We got to GOAL! It is "+ keyFromValue(c));
                break; // This breaks the second loop, not the main one.
            }
        }
    }
}
38
Shepard

ラベル付きブレークの使用:

mainloop:
for(){
 for(){
   if (some condition){
     break mainloop;
   }
  }
}

参照

60
Jigar Joshi

ループにラベルを追加して、_labelled break適切なループから抜け出すために:-

outer: for (...) {
    inner: for(...) {
        if (someCondition) {
            break outer;
        }
    }
}

詳細については、次のリンクを参照してください。

27
Rohit Jain

その関数のコントロールをreturnすることができます。または、いbreak labelsアプローチ:)

forステートメントの後に別のコード部分がある場合、関数内のループをリファクタリングできます。

IMO、ブレークおよびコンティニューの使用は、読みやすさとメンテナンスに影響するため、OOPでは推奨されません。確かに、それらは便利な場合もありますが、一般的にはgotoスタイルのプログラミングの使用を奨励するため、それらを避けるべきだと思います。

どうやらこの質問のバリエーションがたくさん投稿されています。 ここ Peterは、ラベルを使用していくつかの良い使い方と奇妙な使い方を提供しました。

12
dan

Javaのように見えますが、ラベル付きのブレークが進むべき道のようです(他の回答のコンセンサスに基づいて)。

しかし、多くの(ほとんどの?)他の言語、または制御フローのようなgotoを避けたい場合は、フラグを設定する必要があります。

bool breakMainLoop = false;
for(){
    for(){
        if (some condition){
            breakMainLoop = true;
            break;
        }
    }
    if (breakMainLoop) break;
}
3
Thymine

ただ楽しみのために:

for(int d = 0; d < amountOfNeighbors; d++){
    for(int c = 0; c < myArray.size(); c++){
        ...
            d = amountOfNeighbors;
            break;
        ...
    }
    // No code here
}

break labelにコメントしてください:これは前向きな後藤です。ステートメントを壊して次へジャンプできます:

foo: // Label the next statement (the block)
{
    code ...
    break foo;  // goto [1]
    code ...
}

//[1]
2
irreputable

初心者でも最適で簡単な方法:

outerloop:

for(int i=0; i<10; i++){

    // Here we can break the outer loop by:
    break outerloop;

    innerloop:

    for(int i=0; i<10; i++){

        // Here we can break innerloop by:
        break innerloop;
    }
}
0
Keshav bansal