¿Cómo salgo de los bucles anidados en Java?
Tengo una construcción de bucle anidado como este:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break; // Breaks out of the inner loop
}
}
}
Ahora, ¿cómo puedo salir de ambos bucles? He analizado preguntas similares, pero ninguna se refiere específicamente a Java. No pude aplicar estas soluciones porque la mayoría usaba gotos.
No quiero poner el bucle interno en un método diferente.
No quiero devolver los bucles. Al romper, termino con la ejecución del bloque de bucle.
Al igual que otros respondedores, definitivamente preferiría poner los bucles en un método diferente, momento en el cual puedes volver a dejar de iterar por completo. Esta respuesta solo muestra cómo se pueden cumplir los requisitos de la pregunta.
Puedes usarlo break
con una etiqueta para el bucle exterior. Por ejemplo:
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");
}
}
Esto imprime:
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
Técnicamente, la respuesta correcta es etiquetar el bucle exterior. En la práctica, si desea salir en cualquier punto dentro de un bucle interno, sería mejor que externalice el código en un método (un método estático si es necesario) y luego lo llame.
Eso compensaría la legibilidad.
El código quedaría algo así:
private static String search(...)
{
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
return search;
}
}
}
return null;
}
Coincidiendo con el ejemplo de la respuesta aceptada:
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);
}
}
}
}
Puedes usar un bloque con nombre alrededor de los bucles:
search: {
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break search;
}
}
}
}