Frage Ausbrechen von verschachtelten Schleifen in Java


Ich habe ein Nested-Loop-Konstrukt wie folgt:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             break; // Breaks out of the inner loop
         }
    }
}

Wie kann ich jetzt aus beiden Schleifen ausbrechen? Ich habe ähnliche Fragen untersucht, aber keine betrifft Java. Ich konnte diese Lösungen nicht anwenden, weil die meisten gotos verwendet wurden.

Ich möchte die innere Schleife nicht in eine andere Methode bringen.

Update: Ich möchte die Schleifen nicht mehr ausführen, beim Brechen bin ich mit der Ausführung des Schleifenblocks fertig.


1539
2018-05-20 09:07


Ursprung


Antworten:


Wie andere Antworter würde ich definitiv bevorzugen um die innere Schleife in eine andere Methode zu bringen. Diese Antwort zeigt nur, wie die Anforderungen in der Frage erfüllt werden können.

Sie können verwenden break mit einem Etikett für die äußere Schleife. Beispielsweise:

public class Test {
    public static void main(String[] args) {
        outerloop:
        for (int i=0; i < 5; i++) {
            for (int j=0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("Breaking");
                    break outerloop;
                }
                System.out.println(i + " " + j);
            }
        }
        System.out.println("Done");
    }
}

Dies druckt:

0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
Breaking
Done

2080
2018-05-20 09:11



Technisch ist die korrekte Antwort, die äußere Schleife zu beschriften. In der Praxis, wenn Sie an einem beliebigen Punkt innerhalb einer inneren Schleife beenden möchten, wäre es besser, den Code in eine Methode (eine statische Methode, falls erforderlich) zu externalisieren und sie dann aufzurufen.

Das würde sich für die Lesbarkeit auszahlen.

Der Code würde so etwas werden:

private static String search(...) 
{
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition) {
                // Do something and break...
                return search;
            }
        }
    }
    return null; 
}

Übereinstimmendes Beispiel für die akzeptierte Antwort:

 public class Test {
    public static void main(String[] args) {
        loop();
        System.out.println("Done");
    }

    public static void loop() {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("Breaking");
                    return;
                }
                System.out.println(i + " " + j);
            }
        }
    }
}

368
2017-11-14 18:26



Sie können einen benannten Block um die Loops verwenden:

search: {
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition) {
                // Do something and break...
                break search;
            }
        }
    }
}

186
2018-05-20 09:12



Ich benutze nie Etiketten. Es scheint eine schlechte Übung zu sein. Folgendes würde ich tun:

boolean finished = false;
for (int i = 0; i < 5 && !finished; i++) {
    for (int j = 0; j < 5; j++) {
        if (i * j > 6) {
            finished = true;
            break;
        }
    }
}

112
2017-12-07 17:52



Sie können Labels verwenden:

label1: 
for (int i = 0;;) {
    for (int g = 0;;) {
      break label1;
    }
}

79
2018-05-20 09:11



vielleicht mit einer Funktion?

public void doSomething(List<Type> types, List<Type> types2){
  for(Type t1 : types){
    for (Type t : types2) {
      if (some condition) {
         //do something and return...
         return;
      }
    }
  }
}

32
2018-05-20 11:43



Sie können eine temporäre Variable verwenden:

boolean outerBreak = false;
for (Type type : types) {
   if(outerBreak) break;
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             outerBreak = true;
             break; // Breaks out of the inner loop
         }
    }
}

Abhängig von Ihrer Funktion können Sie auch aus der inneren Schleife herauskommen:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             return;
         }
    }
}

15
2018-05-20 09:11