2012-10-25 13 views
35

Se ho un ciclo in un ciclo e una volta se l'istruzione è soddisfatta, voglio interrompere il ciclo principale, come faccio a farlo?Come interrompere il ciclo principale/esterno in un ciclo doppio/annidato?

Questo è il mio codice:

for(int d = 0; d < amountOfNeighbors; d++){ 
     for(int c = 0; c < myArray.size(); c++){ 
      if(graph.isEdge(listOfNeighbors.get(d), c)){ 
       if(keyFromValue(c).equals(goalWord)){ // once this is true I want to break main loop. 
        System.out.println("We got to GOAL! It is "+ keyFromValue(c)); 
        break; // this breaks second loop not main one. 
       } 
      } 
     } 
    } 
+0

utilizzare un'etichetta. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html –

risposta

58

usando pausa etichettato

mainloop: 
for(){ 
for(){ 
    if (some condition){ 
    break mainloop; 
    } 
    } 
} 

anche Vedi

+0

Impressionante! Ho imparato qualcosa di nuovo. Pensavo che le etichette fossero per i giorni passati (ricorda GW-BASIC?).Avrei usato le bandiere booleane per questo, ma le etichette sono molto più belle! – ADTC

+0

@ADTC GW-BASIC non supporta mai le etichette testuali, solo numeri di linea numerici (e ne richiedeva). IIRC, uscendo da Microsoft, era QuickBASIC che aggiungeva il supporto per le etichette testuali e le subroutine denominate. QBasic includeva certamente tale supporto se si deve avere fiducia in Wikipedia, almeno non più tardi rispetto a Visual Basic. –

12

È possibile solo il return il controllo da quella funzione. Oppure usa il brutto approccio break labels :) Se dopo l'istruzione for c'è un'altra parte di codice, puoi rifattorizzare i loop in una funzione.

IMO l'uso di interruzioni e continua deve essere scoraggiato in OOP, poiché influenzano la leggibilità e la manutenzione. Certo, ci sono casi in cui sono a portata di mano, ma in generale penso che dovremmo evitarli, dal momento che incoraggeranno l'uso della programmazione in stile goto.

Apparentemente le variazioni a queste domande sono state postate molto, here Peter ha fornito alcuni buoni e strani usi usando le etichette.

+2

Fonte/difendi la tua affermazione che le etichette sono brutte –

+5

In questo caso particolare, il reso potrebbe essere appropriato. Tuttavia le etichette non sono brutte e spesso utili. –

+2

@ JanDvorak Grazie, brutto e difficile da eseguire il debug. – dan

2

solo per divertimento

for(int d = 0; d < amountOfNeighbors; d++){ 
    for(int c = 0; c < myArray.size(); c++){ 
     ... 
      d=amountOfNeighbors; 
      break; 
     ... 
    } 
    // no code here 
} 

commento sulla break label: è un goto in avanti, si può rompere qualsiasi istruzione e saltare al successivo:

foo: // label the next statement (the block) 
{ 
    code ... 
    break foo; // goto [1] 
    code ... 
} 

//[1] 
+0

Errore di sintassi. Manca un punto e virgola. –

+0

haha ​​:) Sarà sicuro di questo pensiero creativo –

+2

Che sembra pericoloso: o –

3

Sembra per Java una pausa etichettato sembra essere la strada da percorrere (in base al consenso delle altre risposte). (? La maggior parte)

Ma per molti altri linguaggi, o se si vuole evitare qualsiasi goto come flusso di controllo, è necessario impostare un flag:

bool breakMainLoop = false; 
for(){ 
    for(){ 
     if (some condition){ 
      breakMainLoop = true; 
      break; 
     } 
    } 
    if (breakMainLoop) break; 
} 
+0

Se una pausa etichettata è davvero la strada da percorrere in Java, quindi la strada da percorrere in C/C++ è un goto. –

+0

Inoltre, la domanda è chiaramente etichettata come 'java'. –

+1

Non cambia il fatto che qualcuno che cerca "loop annidato" potrebbe imbattersi in esso. @EvanHarper Sarei d'accordo con questa linea di ragionamento, ma non ho passato molto tempo in Java, quindi sono andato con il consenso delle altre risposte ... – Thymine

0

migliori e semplici metodi per principianti anche

outerloop: 
for(int i=0; i<10; i++){ 
    // here we can break Outer loop by 
    break outerloop; 

innerloop: 
    for(int i=0; i<10; i++){ 
     // here we can break innerloop by 
     break innerloop; 
    } 
} 
Problemi correlati