Wie breche ich verschachtelte Schleifen in Java aus?
Lesezeit: 2 Minuten
boutta
Ich habe ein verschachteltes Schleifenkonstrukt 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 nun aus beiden Loops ausbrechen? Ich habe mir ähnliche Fragen angesehen, aber keine betrifft speziell Java. Ich konnte diese Lösungen nicht anwenden, da die meisten gotos verwendet wurden.
Ich möchte die innere Schleife nicht in eine andere Methode stecken.
Ich möchte die Schleifen nicht zurückgeben. Beim Breaking bin ich mit der Ausführung des Schleifenblocks fertig.
Zo72
Technisch gesehen ist die richtige Antwort, die äußere Schleife zu beschriften. In der Praxis, wenn Sie an einem beliebigen Punkt innerhalb einer inneren Schleife beenden möchten, sollten Sie den Code besser in eine Methode (eine statische Methode, wenn nötig) auslagern und sie dann aufrufen.
Das würde sich für die Lesbarkeit auszahlen.
Der Code würde ungefähr so aussehen:
private static String search(...)
{
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
return search;
}
}
}
return null;
}
Passend zum 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);
}
}
}
}
Manchmal verwenden Sie mehrere lokale Variablen, die sich außerhalb der inneren Schleife befinden, und es kann sich unhandlich anfühlen, sie alle zu übergeben.
– Haest
7. Dezember 2011 um 1:15 Uhr
Sie müssen keinen neuen Block erstellen, um ein Label zu verwenden.
– Jon Skeet
20. Mai 2009 um 9:13 Uhr
Nein, aber es macht die Absicht viel klarer. Siehe den ersten Kommentar zur akzeptierten Antwort.
– Bombe
20. Mai 2009 um 9:24 Uhr
Elle Mundy
Ich verwende niemals Etiketten. Es scheint eine schlechte Praxis zu sein, sich darauf einzulassen. 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;
}
}
}
Neuron
Sie können Etiketten verwenden:
label1:
for (int i = 0;;) {
for (int g = 0;;) {
break label1;
}
}
Peter Mortensen
Verwenden Sie eine 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;
}
}
}
}
9648500cookie-checkWie breche ich verschachtelte Schleifen in Java aus?yes