可能性のある複製:
メイン/外部ループをダブル/ネストループで解除する方法
次のような状況です。
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番目のループだけですか?
それは内側のループだけを壊すので、あなたが望むことをします。 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からただし、含まない指定された値までのすべての値を使用するためです。
break
は、最も内側のループ、あなたの場合は2番目のループを壊します。
外側のループを壊すには、次のようにラベルの付いたブレークを使用できます。
OUTER:for(...) {
for(...) {
break OUTER;
}
}
break
は、最も内側のループから抜け出します。
breakは最も近いループ(2番目のループ)に対してのみブレークを引き起こします
二番目だけ。もちろん「後藤」も使えます。
Breakステートメントは、多くの言語で使用されている最も近い囲みループまたはswitchステートメントを終了しますが、100%試すことができます。
内側の2つのループを関数に入れ、returnを使用して両方のループから抜け出します。
さらに制御が必要な場合は、ラベル付きの区切りを使用できます。詳細 ここ 。他の人が言ったように、breakは最も近いループを閉じます。
「found」と呼ぶブール値を使用して、次のように使用するのはどうですか。
while(!found) {
for(...) {
//todo
}
}
もう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 ;
}
}