Tengo una construcción de bucle anidado como esta:
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 examinado 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 volver a ejecutar los bucles. Cuando rompo, termino con la ejecución del bloque de bucle.
java
loops
nested-loops
boutta
fuente
fuente
break
. Incluso entonces, las excepciones son otra excepción más conocida (lo siento). Pero todavía estaría descontento con esto si no fuera obvio (pequeños bucles, comentarios de advertencia si la etiqueta / salto aún no es lo suficientemente visible).outerloop
es una etiqueta. No sé exactamente qué código intentaste, pero el código en mi respuesta se compila y funciona bien.Técnicamente, la respuesta correcta es etiquetar el bucle externo. En la práctica, si desea salir en cualquier punto dentro de un bucle interno, será mejor que externalice el código en un método (un método estático si es necesario) y luego lo llame.
Eso pagaría por la legibilidad.
El código se convertiría en algo así:
Emparejando el ejemplo para la respuesta aceptada:
fuente
loop
método y regrese del método para continuar.Puede usar un bloque con nombre alrededor de los bucles:
fuente
name: if(...){...}
hace que la condición con nombre? :)for
directo. Puede agregar código antes del último}
que se ejecutará solo si la condición nunca se cumplió.Nunca uso etiquetas. Parece una mala práctica entrar. Esto es lo que haría:
fuente
&& !finished
lugar de|| !finished
? ¿Y por qué entonces usarlobreak
en absoluto y no usarlo también&& !finished
para el bucle interno?break
poder salir arbitrariamente del bucle. Si hay código después de eseif
bloque, puedebreak
hacerlo antes de que se ejecute. Pero tienes razón&&
. Arreglado.Puedes usar etiquetas:
fuente
Usa una función:
fuente
Puedes usar una variable temporal:
Dependiendo de su función, también puede salir / regresar desde el bucle interno:
fuente
Si no le gusta
break
sygoto
s, puede usar un bucle for "tradicional" en lugar del for-in, con una condición de aborto adicional:fuente
Necesitaba hacer algo similar, pero elegí no usar el bucle mejorado para hacerlo.
fuente
s
a un valor que sea menori
o cambiari
a un valor mayor o igual ques
, ambos deberían funcionar. Tiene razón sobre el cambios
, porque puede usarse en otro lugar más tarde, pero cambiari
no dañará, solo se asegurará de que el primerofor
no continúe en bucle.Prefiero agregar una "salida" explícita a las pruebas de bucle. Le deja claro a cualquier lector casual que el ciclo puede terminar antes de tiempo.
fuente
Stream
Solución Java 8 :fuente
Por lo general, en tales casos, se trata de una lógica más significativa, digamos algunas búsquedas o manipulaciones sobre algunos de los objetos 'for' iterados en cuestión, por lo que generalmente uso el enfoque funcional:
Contras principales:
Los profesionales:
Por lo tanto, solo se trata del caso a través de un enfoque diferente.
Básicamente una pregunta al autor de esta pregunta: ¿qué considera usted de este enfoque?
fuente
Puede romper todos los bucles sin usar ninguna etiqueta: y banderas.
Es solo una solución complicada.
Aquí, la condición 1 es la condición que se usa para romper el bucle K y J. Y la condición 2 es la condición que se usa para romper el bucle K, J e I.
Por ejemplo:
fuente
(int k = 0; k < 10; k++)
y no arreglaste todok = 9
ak = 10
. Puede entrar en un bucle infinito.El concepto de ruptura etiquetada se usa para dividir bucles anidados en Java, al usar la rotura rotulada puede romper la anidación de bucles en cualquier posición. Ejemplo 1:
supongamos que hay 3 bucles y desea terminar el bucle3: Ejemplo 2:
fuente
fuente
Si está dentro de alguna función, ¿por qué no la devuelve?
fuente
Método mejor y más fácil.
fuente
Enfoque bastante inusual, pero en términos de longitud del código ( no de rendimiento ), esto es lo más fácil que puede hacer:
fuente
Use etiquetas.
Consulte este articulo
fuente
Otra solución, mencionada sin ejemplo (en realidad funciona en código prod).
Por supuesto,
BreakLoopException
debe ser interno, privado y acelerado con no-stack-trace:fuente
for (int j = 0; j < 5; j++) //inner loop
debe sustituirse porfor (int j = 0; j < 5 && !exitloops; j++)
.Aquí, en este caso, los bucles anidados completos deben salir si la condición es
True
. Pero si usamosexitloops
solo para la parte superiorloop
Luego, el bucle interno continuará, porque no hay un indicador adicional que notifique que este bucle interno salga.
Por lo tanto, también debe usarse
exitloops
en los bucles internos.fuente
Como en la sugerencia de información de 1800, use la condición que rompe el bucle interno como una condición en el bucle externo:
fuente
Si se trata de una nueva implementación, puede intentar reescribir la lógica como declaraciones if-else_if-else.
De lo contrario, puede intentar establecer un indicador cuando se haya producido esa condición especial y verificar ese indicador en cada una de sus condiciones de bucle.
¡AQUÍ! Así, mientras que una ruptura simple no va a funcionar, se puede hacer el trabajo usando
continue
.Si simplemente está transfiriendo la lógica de un lenguaje de programación a Java y solo quiere que funcione, puede intentar usar etiquetas .
fuente
Demo para
break
,continue
ylabel
:Palabras clave de Java
break
ycontinue
tienen un valor predeterminado. Es el "ciclo más cercano", y hoy, después de unos años de usar Java, ¡lo acabo de obtener!Parece usado raramente, pero útil.
fuente
Manifestación
fuente
Puedes hacer lo siguiente:
establecer una variable local en
false
establezca esa variable
true
en el primer bucle, cuando quiera romperentonces puede verificar en el bucle externo, que si la condición está establecida, también se separará del bucle externo.
fuente
Para algunos casos, podemos usar el
while
bucle de manera efectiva aquí.fuente
Java no tiene una función de ir a Goto como la hay en C ++. Pero aún así,
goto
es una palabra clave reservada en Java. Podrían implementarlo en el futuro. Para su pregunta, la respuesta es que hay algo llamado etiqueta en Java al que puede aplicar una declaracióncontinue
ybreak
. Encuentra el código a continuación:fuente
Incluso crear una bandera para el ciclo externo y verificar que después de cada ejecución del ciclo interno puede ser la respuesta.
Me gusta esto:
fuente
Úselo
condition
como una bandera para cuando haya terminado de procesar. Luego, el bucle interno solo continúa mientras la condición no se ha cumplido. De cualquier manera, el bucle externo seguirá chuggin '.fuente