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 Schleifen 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 einfügen.
Ich möchte die Schleifen nicht erneut ausführen. Beim Brechen bin ich mit der Ausführung des Schleifenblocks fertig.
quelle
break
. Auch dann sind Ausnahmen eine weitere bekanntere Ausnahme (sorry). Aber ich wäre immer noch unglücklich darüber, wenn es nicht offensichtlich wäre (kleine Schleifen, Warnkommentar, wenn das Label / der Bruch immer noch nicht sichtbar genug sind).outerloop
ist ein Label. Ich weiß nicht genau, welchen Code Sie ausprobiert haben, aber der Code in meiner Antwort wird kompiliert und läuft einwandfrei.Technisch gesehen ist die richtige Antwort, die äußere Schleife zu beschriften. In der Praxis ist es besser, den Code in eine Methode (gegebenenfalls eine statische Methode) zu externalisieren und ihn dann aufzurufen, wenn Sie an einem beliebigen Punkt innerhalb einer inneren Schleife beenden möchten.
Das würde sich für die Lesbarkeit auszahlen.
Der Code würde so etwas werden:
Passend zum Beispiel für die akzeptierte Antwort:
quelle
loop
Methode und kehren Sie von der Methode zurück, um fortzufahren.Sie können einen benannten Block um die Schleifen verwenden:
quelle
name: if(...){...}
ein benannter Zustand vorliegt. :)for
direkten Kennzeichnung des . Sie können vor dem letzten Code hinzufügen}
, der nur ausgeführt wird, wenn die Bedingung nie erfüllt wurde.Ich benutze niemals Etiketten. Es scheint eine schlechte Praxis zu sein, sich darauf einzulassen. Folgendes würde ich tun:
quelle
&& !finished
stattdessen sein|| !finished
? Und warum dannbreak
überhaupt verwenden und nicht auch&& !finished
für die innere Schleife verwenden?break
in der Lage, die Schleife willkürlich zu verlassen. Wenn nach diesemif
Block Code vorhanden ist , könnenbreak
Sie dies tun, bevor er ausgeführt wird. Aber du hast recht&&
. Repariert.Sie können Etiketten verwenden:
quelle
Verwenden Sie eine Funktion:
quelle
Sie können eine temporäre Variable verwenden:
Abhängig von Ihrer Funktion können Sie auch die innere Schleife verlassen / verlassen:
quelle
Wenn Sie
break
s undgoto
s nicht mögen , können Sie anstelle des for-in eine "traditionelle" for-Schleife verwenden, mit einer zusätzlichen Abbruchbedingung:quelle
Ich musste etwas Ähnliches tun, aber ich entschied mich dafür, die erweiterte for-Schleife nicht zu verwenden.
quelle
s
zu einem Wert wechseln , der kleiner alsi
oderi
zu einem Wert größer oder gleichs
ist. Beide sollten den Trick ausführen . Sie haben Recht mit dem Änderns
, da es später an anderer Stelle verwendet werden kann, aber das Änderni
schadet nicht, stellt nur sicher, dass das erstefor
nicht weiter wiederholt wird.Ich bevorzuge es, den Schleifentests einen expliziten "Exit" hinzuzufügen. Es macht jedem Gelegenheitsleser klar, dass die Schleife möglicherweise vorzeitig endet.
quelle
Java 8-
Stream
Lösung:quelle
Normalerweise kommt es in solchen Fällen zu einer aussagekräftigeren Logik, zum Beispiel zum Suchen oder Manipulieren einiger der fraglichen iterierten 'for'-Objekte, daher verwende ich normalerweise den funktionalen Ansatz:
Hauptnachteile:
Die Profis:
Es geht also nur darum, den Fall über einen anderen Ansatz zu behandeln.
Grundsätzlich eine Frage an den Autor dieser Frage: Was halten Sie von diesem Ansatz?
quelle
Sie können alle Schleifen ohne Verwendung von label: und Flags unterbrechen.
Es ist nur eine knifflige Lösung.
Hier ist Bedingung1 die Bedingung, die verwendet wird, um von Schleife K und J zu brechen. Und Bedingung2 ist die Bedingung, die verwendet wird, um von Schleife K, J und I zu brechen.
Zum Beispiel:
quelle
(int k = 0; k < 10; k++)
und Sie haben nicht alle die fixk = 9
ank = 10
. Sie könnten in eine Endlosschleife geraten.Das Konzept der beschrifteten Unterbrechung wird verwendet, um verschachtelte Schleifen in Java auszubrechen. Mit der Bezeichnung der beschrifteten Unterbrechung können Sie die Verschachtelung von Schleifen an jeder Position aufheben. Beispiel 1:
Angenommen, es gibt 3 Schleifen und Sie möchten die Schleife beenden3: Beispiel 2:
quelle
quelle
Wenn es sich in einer Funktion befindet, warum geben Sie es nicht einfach zurück:
quelle
Beste und einfachste Methode ..
quelle
Eher ungewöhnlicher Ansatz, aber in Bezug auf die Codelänge ( nicht die Leistung ) ist dies das Einfachste, was Sie tun können:
quelle
Verwenden Sie Etiketten.
Siehe diesen Artikel
quelle
Eine andere Lösung, die ohne Beispiel erwähnt wird (sie funktioniert tatsächlich im Produktcode).
Natürlich
BreakLoopException
sollte es intern, privat und mit No-Stack-Trace beschleunigt sein:quelle
for (int j = 0; j < 5; j++) //inner loop
sollte durch ersetzt werdenfor (int j = 0; j < 5 && !exitloops; j++)
.In diesem Fall sollten vollständige verschachtelte Schleifen beendet werden, wenn die Bedingung erfüllt ist
True
. Aber wenn wirexitloops
nur nach oben verwendenloop
Dann wird die innere Schleife fortgesetzt, da es kein zusätzliches Flag gibt, das diese innere Schleife zum Verlassen benachrichtigt.
Es muss also auch
exitloops
für die inneren Schleifen verwendet werden.quelle
Verwenden Sie wie im Vorschlag für @ 1800 INFORMATION die Bedingung, die die innere Schleife unterbricht, als Bedingung für die äußere Schleife:
quelle
Wenn es sich um eine neue Implementierung handelt, können Sie versuchen, die Logik als if-else_if-else-Anweisungen neu zu schreiben.
Andernfalls können Sie versuchen, ein Flag zu setzen, wenn diese spezielle Bedingung aufgetreten ist, und in jeder Ihrer Schleifenbedingungen nach diesem Flag suchen.
HIER! Während eine einfache Pause nicht funktioniert, kann sie mit verwendet werden
continue
.Wenn Sie einfach die Logik von einer Programmiersprache nach Java portieren und nur das Ding zum Laufen bringen möchten, können Sie versuchen, Labels zu verwenden .
quelle
Demo für
break
,continue
undlabel
:Java-Schlüsselwörter
break
undcontinue
haben einen Standardwert. Es ist die "nächste Schleife", und heute, nach ein paar Jahren mit Java, habe ich sie gerade bekommen!Es scheint selten verwendet zu werden, aber nützlich.
quelle
Demo
quelle
Sie können Folgendes tun:
Setzen Sie eine lokale Variable auf
false
Setzen Sie diese Variable
true
in der ersten Schleife, wenn Sie brechen möchtenDann können Sie in der äußeren Schleife überprüfen, ob die Bedingung gesetzt ist, und dann auch von der äußeren Schleife abbrechen.
quelle
In einigen Fällen können wir die
while
Schleife hier effektiv verwenden.quelle
Java hat keine Goto-Funktion wie in C ++. Dennoch
goto
ist ein reserviertes Schlüsselwort in Java. Sie könnten es in Zukunft implementieren. Auf Ihre Frage lautet die Antwort, dass es in Java ein sogenanntes Label gibt, auf das Sie einecontinue
and-break
Anweisung anwenden können . Finden Sie den Code unten:quelle
Sogar das Erstellen eines Flags für die äußere Schleife und das Überprüfen, ob nach jeder Ausführung der inneren Schleife die Antwort sein kann.
So was:
quelle
Verwenden Sie
condition
als Flag für , wenn Sie fertig Verarbeitung sind. Dann wird die innere Schleife nur fortgesetzt, solange die Bedingung nicht erfüllt ist. In jedem Fall wird die äußere Schleife weiter tuckern.quelle