2010-12-02 10 views
15

Duplicar posibles:
How to Break from main/outer loop in a double/nested loop?Rotura en bucles for anidados

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); 

se realiza una vez y luego sale del bucle interno y continúa con el bucle for (int i .... Así que usé un descanso en mi código. Pero no estoy seguro si esto es correcto. ¿La ruptura causa un descanso para todos los bucles o solo para el segundo bucle?

Respuesta

39

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.

Puede considerar hacer un método separado para el lazo interno de todos modos; es algo que fácilmente le puede dar un nombre ("find_available_station" o algo así), y probablemente necesite otro lugar.

Además, tenga en cuenta que sus bucles en este momento perderán el último elemento de cada conjunto. Piense con cuidado acerca de por qué está usando < en lugar de < =; es exactamente para que use cada valor desde 0 hasta pero sin incluir el especificado.

1

ruptura causará ruptura de lazo más cercano solamente (segundo bucle)

3

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

1

Solo el segundo. Puedes usar "goto" por supuesto.

1

La declaración de interrupción finaliza el bucle cerrado más cercano o declaración de conmutación en la que aparece en varios idiomas, pero puede intentarlo y estar seguro al 100%.

1

ponga los dos bucles internos en una función y use return para salir de ambos.

1

Si necesita más control, puede usar un descanso rotulado. Más información here. Como han dicho otros, break cerrará el ciclo más cercano.

5

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

Para que sea romper el bucle externo puede utilizar un descanso etiquetado como:

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

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

for (int k = 0; k < stationen.length-1; k ++) { si (Stationen [k] .reparatur == null) { schlepper.fliege (stationen [k] .x, stationen [k] .y, stationen [k].z);

    k = stationen.length + 1 ; 

       } 
      } 
1

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

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