Frage

Hallo Ich bin Anfänger in Java und mein Programm hat 4 für Schleifen: mein Programm funktioniert wie folgt, dass, wenn b true ist, wird das Element von Punktliste und n wird n-- sein entfernt werden und die ich von allen für Schleifen ausgehen wollen und kommen wieder von der ersten zur Schleife so l l++ sein wird, wie kann ich das tun? mit break-Anweisung?

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);
              }
           }
       }
    }
}
War es hilfreich?

Lösung

Sie können Verwendung eines markierten Pause machen, wie:

      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);
                    }

                }

            }
        }
    }

Andere Tipps

In einer Schleife die break Anweisung beendet die innere Schleife während continue auf die nächste Iteration überspringt. Um für diese beiden Aussagen zur Arbeit auf einer andere Schleife an den inneren müssen Sie verwenden Etiketten . So etwas sollte funktionieren:

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);
                        }

                    }

                }
            }
        }

Haben Sie einen Blick auf die markierten break-Anweisung

zum Beispiel hier: Branching Statements

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

Verwenden Sie eine markierte Schleife

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);
                }

            }

        }
    }
}

und dann bricht aus der markierten Schleife

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);
                    }

                }

            }
        }
    }

Ich stimme mit allen anderen Antworten. Ich möchte jedoch darauf hinweisen, dass eine Alternative zu exit nur sein würde in seiner eigenen Routine, dass Code setzen und eine return Aussage zu brechen aus der ganzen Sache zu nutzen. Ihre Quad-verschachtelte Schleife ist so komplex, von selbst, dass es wahrscheinlich sowieso in seiner eigenen Routine zu sein verdient.

Ich habe auf DoD Jobs gearbeitet, die eine zyklomatischen erforderlich Komplexität von nicht mehr als 6 für irgendeine Routine (mit einigen Ausnahmen). Diese Serie von Schleifen allein ist 4. Wenn Sie nicht einen einfacheren Weg finden, es zu tun, sollten Sie sie wirklich nur in ihrer eigenen Routine schmeißen die geistige Gesundheit des armen Schmucks zu bewahren, die diesen Code zu pflegen haben.

Ein erster 'quick and dirty' Lösung wäre, eine stay_into_loops Variable zu verwenden und ändern Sie die for Schleifen wie:

 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;

Allerdings ist es in der Regel ein Code Geruch, wenn Sie Dinge wie diese stoßen. Betrachten Sie den Code Refactoring, weil diese in ein Chaos irgendwann eskaliert.

Erstellen Sie eine Ausfahrt für sich selbst in jeder inneren for-Schleife.
Hier ist eine schnelle und schmerzlos Lösung.

  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;                            
                }
  }

So können Sie die breakout boolean sehen ist Ihr Ticket jeder inneren Schleife aus, Coz es in jeder for Erklärung überprüft wird. Und es wird jedesmal, wenn die ersten for Iterierten zurückgesetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top