質問

こんにちは 私はJavaで初心者ですと私のプログラムはループの4を持っています: 私のプログラムはbtrueであれば、要素はpointListから削除され、nn--になり、私はループのすべてから出て行くと、ループの最初からもう一度来たい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の繰り返し処理をリセット取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top