18

重複の可能性:
ダブル/ネストされたループでメイン/アウターループから抜け出す方法は?

私は次の状況にあります:

      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番目のループに対してのみですか?

4

10 に答える 10

46

それは内側のループだけを壊すので、あなたが望むことをします。複数のレベルをブレークするには、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から指定された値までのすべての値を使用するためです。

于 2010-12-02T06:42:43.783 に答える
6

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

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

OUTER:for(...) {
         for(...) {
            break OUTER;
         }
      }
于 2010-12-02T06:42:11.637 に答える
3

break最も内側のループから抜け出すだけです。

于 2010-12-02T06:38:59.110 に答える
1

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

于 2010-12-02T06:38:47.097 に答える
1

ちょうど2番目のもの。もちろん「goto」も使えます。

于 2010-12-02T06:39:20.157 に答える
1

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

于 2010-12-02T06:40:17.047 に答える
1

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

于 2010-12-02T06:40:40.717 に答える
1

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

于 2010-12-02T06:40:52.383 に答える
1

'found'と呼ばれるブール値を使用して、次のように使用するのはどうでしょうか。

while(!found) {
    for(...) {
        //todo
    }
}
于 2010-12-02T08:04:58.660 に答える
0

もう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 ;

                }
            }
于 2010-12-02T06:46:05.847 に答える