2012-10-25 12 views
35

Jeśli mam pętlę w pętli i raz, jeśli instrukcja jest spełniona, chcę przerwać główną pętlę, jak mam to zrobić?Jak zerwać z pętli głównej/zewnętrznej w podwójnej/zagnieżdżonej pętli?

To jest mój kod:

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

użyć etykiety. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html –

Odpowiedz

58

użyciem znakowanego przerwę

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

Zobacz także

+0

Awesome! Nauczyłem się czegoś nowego. Myślałem, że etykiety były przez wiele dni (pamiętaj GW-BASIC?).W tym celu użyłbym boolowskich flag, ale etykiety są znacznie chłodniejsze! – ADTC

+0

@ADTC GW-BASIC nigdy nie obsługiwał etykiet tekstowych, tylko numery linii numerycznych (i to wymagane). IIRC, wychodząc z Microsoftu, był QuickBASIC, który dodał wsparcie dla etykiet tekstowych, a także nazwane podprogramy. QBasic z pewnością zawierał takie wsparcie, jeśli Wikipedia ma być zaufana, przynajmniej nie później niż Visual Basic. –

12

Możesz tylko return kontrolować z tej funkcji. Lub użyj brzydkiego podejścia break labels :) Jeśli istnieją inne części kodu po poleceniu for, możesz zmienić pętle w funkcji.

IMO użycie przerw i kontynuacja należy odradzać w OOP, ponieważ mają one wpływ na czytelność i konserwację. Oczywiście, są przypadki, w których są one przydatne, ale generalnie uważam, że powinniśmy ich unikać, ponieważ będą zachęcać do używania programowania w stylu goto.

Wygląda na to, że różne odmiany tego pytania są wysyłane dużo, here Peter podał kilka dobrych i dziwnych zastosowań z użyciem etykiet.

+2

Źródło/obrona informacji o brzydkich etykietach –

+5

W tym konkretnym przypadku zwrot może być właściwy. Jednak etykiety nie są brzydkie i często przydatne. –

+2

@JanDvorak Dzięki, brzydki i trudny do debugowania. – dan

2

tylko dla zabawy

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

komentarz na break label: To naprzód goto może złamać wszelkie oświadczenia i przejść do następnego:

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

//[1] 
+0

Błąd składni. Brakuje średnika. –

+0

haha ​​:) Czy na pewno uda się stworzyć to kreatywne myślenie? –

+2

To wygląda niebezpiecznie: o –

3

Wygląda Java znakowany przerwa wydaje być drogą do wyjścia (w oparciu o konsensus pozostałych odpowiedzi). (? Najbardziej)

Ale dla wielu innych językach, lub jeśli chcesz aby uniknąć goto jak przepływ sterowania, trzeba ustawić flagę:

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

Jeśli oznaczona etykietą przerwa naprawdę jest sposób, aby przejść w Javie, a następnie sposób, aby przejść w C/C++ jest goto. –

+0

Ponadto, pytanie jest wyraźnie oznaczone jako 'java'. –

+1

Nie zmienia faktu, że ktoś, kto szuka "zagnieżdżonej pętli", może na nią trafić. @EvanHarper Zgodziłbym się z tą linią rozumowania, ale nie spędziłem zbyt wiele czasu w Javie, więc poszedłem z konsensusem innych odpowiedzi ... – Thymine

0

najlepsze i proste metody dla początkujących nawet

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