2011-07-10 11 views
37

Używam java od dłuższego czasu, ale moje wykształcenie w pętli jest nieco brakuje. Wiem, jak utworzyć każdą pętlę, która istnieje w Javie i wyłamać się z pętli. Jednak niedawno o tym pomyślałem:Jak wyjść z dwóch zagnieżdżonych pętli

Powiedzmy, że mam dwie pętle zagnieżdżone. Czy mogę zerwać obie pętle, używając tylko jednej instrukcji break?

Oto, co mam do tej pory.

int points = 0; 
int goal = 100; 
while (goal <= 100) { 
    for (int i = 0; i < goal; i++) { 
     if (points > 50) { 
     break; //for loop ends, while loop does not 
     } 
    //I know I could put a 'break' statement here and end the while loop but I want to do it using just one 'break' statement 
    points += i; 
    } 
} 

Czy jest jakiś sposób, aby to osiągnąć?

Odpowiedz

80

w Javie można użyć etykiety, aby określić, które pętli przerwać/kontynuować:

mainLoop: 
while (goal <= 100) { 
    for (int i = 0; i < goal; i++) { 
     if (points > 50) { 
     break mainLoop; 
     } 
     points += i; 
    } 
} 
+0

Ale nie jest goto (w tym przypadku, pseudo-goto) zła? –

+0

@ZiyaoWei: IMo 'goto' nie jest" czystym złem ". Używaj go ostrożnie i tylko wtedy, gdy naprawdę potrzebujesz. –

+1

@Grzegorz Tęsknię za dawnych dobrych dni, w których mogłem używać goto bez kogoś, kto wskazywałby moje plecy;) –

19

Tak, można napisać break with label np

int points = 0; 
int goal = 100; 
someLabel: 
while (goal <= 100) { 
    for (int i = 0; i < goal; i++) { 
     if (points > 50) { 
     break someLabel; 
     } 
    points += i; 
    } 
} 
// you are going here after break someLabel; 
+0

Dziękuję bardzo! – fireshadow52

6

Istnieje wiele sposobów na skórę ten kot . Oto jeden:

int points = 0; 
int goal = 100; 
boolean finished = false; 
while (goal <= 100 && !finished) { 
    for (int i = 0; i < goal; i++) { 
     if (points > 50) { 
     finished = true; 
     break; 
     } 
    points += i; 
    } 
} 

Aktualizacja: Wow, nie wiedziałem o zerwaniu z etykietami. To wydaje się lepszym rozwiązaniem.

+0

Dzięki! Chciałbym móc przyjąć wszystkie odpowiedzi! – fireshadow52

+0

To jest fajne. Twoja odpowiedź ma jednak sens. :) – fireshadow52

1

elementarne, drogi Watsonie ...

int points = 0; 
int goal = 100; 

while (goal <= 100) { 
    for (int i = 0; i < goal; i++) { 
    if (points > 50) { 
     goal++; 
     break; 
    } 
    points += i; 
    } 
} 

lub

int points = 0; 
int goalim = goal = 100; 

while (goal <= goalim) { 
    for (int i = 0; i < goal; i++) { 
    if (points > 50) { 
     goal = goalim + 1; 
     break; 
    } 
    points += i; 
    } 
} 
0

Można zresetować zmienne sterujące pętli.

int points = 0; 
int goal = 100; 
while (goal <= 100) { 
    for (int i = 0; i < goal; i++) { 
     if (points > 50) { 
     i = goal = 101; 
     } 
    points += i; 
    } 
} 
0

Nie należy używać etykiet w języku obiektywnym. Musisz przepisać warunek// while.

więc kod powinien wyglądać tak:

int points = 0; 
int goal = 100; 
while (goal <= 100 && points <= 50) { 
    for (int i = 0; i < goal && points <= 50; i++) { 
     points += i; 
    } 
} 

// now points are 55 
+0

To tak naprawdę nie odpowiada na pytanie. To jest bardziej komentarz. – rghome

+0

post został zaktualizowany o przykładowy kod –

Powiązane problemy