web-dev-qa-db-ja.com

ネストされたforループを中断する

可能性のある複製:
メイン/外部ループをダブル/ネストループで解除する方法

次のような状況です。

      for(int i = 0; i < schiffe.length-1; i++){
            if(schiffe[i].schaden){
                schlepper.fliege(schiffe[i].x, 
                                 schiffe[i].y, 
                                 schiffe[i].z);
                schlepper.wirdAbgeschleppt = schiffe[i];
                for(int k = 0; k < stationen.length-1; k++){
                    if(stationen[k].reparatur == null){
                        schlepper.fliege(stationen[k].x,
                                         stationen[k].y,
                                         stationen[k].z);
                        break;
                    }
                }
            }
        }

したい

schlepper.fliege(stationen[k].x,
                 stationen[k].y,
                 stationen[k].z);

一度実行してから、内側のループから抜け出し、for(int i ...ループを続行します。そのため、コードでブレークを使用しました。しかし、これが正しいかどうかは本当にわかりません。ブレークによってブレークが発生しますか?すべてのループまたは2番目のループだけですか?

18
Upvote

それは内側のループだけを壊すので、あなたが望むことをします。 Javaで複数のレベルをブレークするには、次のように「ラベル付きブレーク」を使用できます。

schiffe_loop:
for(int i = 0; i < schiffe.length-1; i++){
    some_stuff();
    for(int k = 0; k < stationen.length-1; k++){
        if (something_really_bad_happened()) {
            break schiffe_loop;
        }
    }
}

しかし、通常これは必要ありません。

とにかく、内部ループ用に別のメソッドを作成することを検討してください。これは簡単に名前を付けることができるもの( "find_available_station"またはそのようなもの)であり、おそらく別の場所で必要になるでしょう。

また、現在のループでは各配列の最後の要素が失われることに注意してください。 <=の代わりに<を使用する理由について慎重に検討してください。これは、0からただし、含まない指定された値までのすべての値を使用するためです。

44
Karl Knechtel

breakは、最も内側のループ、あなたの場合は2番目のループを壊します。

外側のループを壊すには、次のようにラベルの付いたブレークを使用できます。

OUTER:for(...) {
         for(...) {
            break OUTER;
         }
      }
6
codaddict

breakは、最も内側のループから抜け出します。

3
Carl Norum

breakは最も近いループ(2番目のループ)に対してのみブレークを引き起こします

1
Petro Semeniuk

二番目だけ。もちろん「後藤」も使えます。

1
onemasse

Breakステートメントは、多くの言語で使用されている最も近い囲みループまたはswitchステートメントを終了しますが、100%試すことができます。

1
Jahan

内側の2つのループを関数に入れ、returnを使用して両方のループから抜け出します。

1
Dan D.

さらに制御が必要な場合は、ラベル付きの区切りを使用できます。詳細 ここ 。他の人が言ったように、breakは最も近いループを閉じます。

1
darioo

「found」と呼ぶブール値を使用して、次のように使用するのはどうですか。

while(!found) {
    for(...) {
        //todo
    }
}
1
KristianB

もう1つできることを考えます。

for(int k = 0; k <stationen.length-1; k ++){if(stationen [k] .reparatur == null){schlepper.fliege(stationen [k] .x、stationen [k] .y、stationen [k] .z);

                   k =  stationen.length + 1 ;

                }
            }
0
Jimit Tank