Pregunta

  

Duplicar posibles:
   Cómo romper de bucle principal / externa en un bucle doble / anidada?

Tengo la siguiente situación:

      for(int i = 0; i < schiffe.length-1; i++){
            if(schiffe[i].schaden){
                schlepper.fliege(schiffe[i].x, 
                                 schiffe[i].y, 
                                 schiffe[i].z);
                schlepper.wirdAbgeschleppt = schiffe[i];
                for(int k = 0; k < stationen.length-1; k++){
                    if(stationen[k].reparatur == null){
                        schlepper.fliege(stationen[k].x,
                                         stationen[k].y,
                                         stationen[k].z);
                        break;
                    }
                }
            }
        }

Quiero

schlepper.fliege(stationen[k].x,
                 stationen[k].y,
                 stationen[k].z);

realizarse una vez y luego romper el bucle interno y continuar con el for (int i ... bucle. Así que he usado un descanso en mi código. Pero no estoy muy seguro de si esto es correcto. ¿La ruptura causar una ruptura de todos los lazos o simplemente para el segundo bucle?

¿Fue útil?

Solución

Se rompe sólo el bucle interno, y por lo tanto hace lo que quiere. Para romper más de un nivel, en Java, puede utilizar una "ruptura con la etiqueta" de esta manera:

schiffe_loop:
for(int i = 0; i < schiffe.length-1; i++){
    some_stuff();
    for(int k = 0; k < stationen.length-1; k++){
        if (something_really_bad_happened()) {
            break schiffe_loop;
        }
    }
}

Pero por lo general no necesitará esto.

Se puede considerar la posibilidad de un método independiente para el bucle interno de todos modos; Es algo que se puede dar fácilmente un nombre a ( "find_available_station" o algo por el estilo), y probablemente necesitará otro lugar.

Además, por favor tenga en cuenta que sus bucles en estos momentos se perderán el último elemento de cada matriz. Piense con cuidado acerca de por qué está utilizando pero sin incluir la especificada.

Otros consejos

break romperá el bucle más interior, en su caso segundo bucle.

Para hacer que se rompa el bucle externo puede utilizar un descanso etiquetado como:

OUTER:for(...) {
         for(...) {
            break OUTER;
         }
      }

break sólo rompe fuera del bucle más interno.

descanso causará descanso para el bucle más cercano solamente (segundo bucle)

Al igual que el segundo. Puede utilizar "goto", por supuesto.

sentencia break termina el bucle encierra más cercana o sentencia switch en el que aparece en muchos idiomas, pero se puede probar y estar seguro al 100%.

puso a los dos bucles internos en un retorno de la función y el uso de romper los dos.

Si necesita más control, puede utilizar un descanso etiquetado. Más información aquí . Como han dicho otros, ruptura se cerrará el bucle más cercano.

¿Qué pasa con el uso de un valor lógico que llame 'encontró' y usarlo como esto:

while(!found) {
    for(...) {
        //todo
    }
}

Creo que se puede hacer una cosa más ..

for (int k = 0; k

                   k =  stationen.length + 1 ;

                }
            }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top