Wie können wir aus 4 inneren for-Schleifen ausgehen?
-
26-09-2019 - |
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);
}
}
}
}
}
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.