どのように我々は、forループ4の内側から出て行くことができますか?
-
26-09-2019 - |
質問
こんにちは
私はJavaで初心者ですと私のプログラムはループの4を持っています:
私のプログラムはb
がtrue
であれば、要素はpointListから削除され、n
がn--
になり、私はループのすべてから出て行くと、ループの最初からもう一度来たいl
、どのように缶になるl++
ていることを、このように動作します私はこれをします ? break文で?
for (int l = 0; l < n; l++) {
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break;
}
else
System.out.println(b);
}
}
}
}
}
解決
あなたはのようにラベルされたブレークを利用することができます
for (int l = 0; l < n; l++) {
foo: for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break foo;
}
else
System.out.println(b);
}
}
}
}
}
他のヒント
break
は、次の繰り返しにスキップしながらループでcontinue
文は、内側のループを終了します。内側のいずれかに異なるループ上の仕事にこれらの二つの文ためには、あなたが使用する必要がある<のhref =「http://download.oracle.com/javase/tutorial/java/nutsandbolts/branch.html」のrel =」 noreferrer "> のラベルを付けます。このような何かが動作するはずます:
outerloop:
for (int l = 0; l < n; l++) {
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
continue outerloop;
}
else
System.out.println(b);
}
}
}
}
}
ラベル付きbreak文を見てください。
ここで例えばString valueFromObj2 = null;
String valueFromObj4 = null;
OUTERMOST: for(Object1 object1: objects){
for(Object2 object2: object1){
//I get some value from object2
valueFromObj2 = object2.getSomeValue();
for(Object3 object3 : object2){
for(Object4 object4: object3){
//Finally I get some value from Object4.
valueFromObj4 = object4.getSomeValue();
//Compare with valueFromObj2 to decide either to break all the foreach loop
if( compareTwoVariable(valueFromObj2, valueFromObj4 )) {
break OUTERMOST;
}
}//fourth loop ends here
}//third loop ends here
}//second loop ends here
}//first loop ends here
ラベルされたループを使用してください。
for (int l = 0; l < n; l++) {
loopa:
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break loopa;
}
else
System.out.println(b);
}
}
}
}
}
、その後、ラベルされたループから破る
again:
for (int l = 0; l < n; l++) {
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break again;
}
else
System.out.println(b);
}
}
}
}
}
私はすべての他の回答に同意します。しかし、私はexit
に代わるだけで、独自のルーチンでそのコードを入れて、全体のものから抜け出すためにreturn
ステートメントを使用することであろうことを指摘したいと思います。あなたのクワッドネストされたループは、それはおそらく、とにかく、独自のルーチンであることに値することそれ自体が非常に複雑である。
私は循環的複雑度を必要と国防総省の仕事で働いてきましたこれ以上(一部例外あり)いずれかのルーチンの6以上の。あなたがそれを行うための簡単な方法を見つけることができない場合のみ、ループのこのシリーズは4である、あなたは本当にただ、このコードを維持する必要が貧しいSCHMUCKSの健全性を維持するために、独自のルーチンでそれらをチャックべきである。
A最初の「間に合わせ」ソリューションは、stay_into_loops
変数を使用してのようなfor
ループを変更することになります:
boolean stay_into_loops = true
// here goes the first for loop
for (int i = 1; i < (n - 2) && stay_into_loops ; i++) {
for (int j = i + 1; j < (n - 1) && stay_into_loops ; j++) {
for (int k = j + 1; k < n && stay_into_loops ; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), `pointList.get(i), pointList.get(j), pointList.get(k));`
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
stay_into_loops = false;
break;
しかし、それはあなたがこれらのようなものが発生したコードのにおいは一般的です。これはいくつかの点で混乱に発展しますので、コードをリファクタリングを検討します。
ループの各内部での自分のための出口を作成します。
ここでは、迅速かつ無痛ソリューションです。
bool breakout;
for (int l = 0; l < n; l++)
{
breakout = false;
for (int i = 1; i < (n - 2) && !breakout; i++)
for (int j = i + 1; j < (n - 1) && !breakout; j++)
for (int k = j + 1; k < n && !breakout; k++)
{
if(b == true)
breakout = true;
}
}
ご覧のように、それはすべてのbreakout
宣言でオンになりますだって for
ブールは、あなたのチケットは、各内部ループの外にあります。
そして、それは毎回最初for
の繰り返し処理をリセット取得します。