Mam zagnieżdżoną konstrukcję pętli:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break; // Breaks out of the inner loop
}
}
}
Jak mogę teraz wyjść z obu pętli? Patrzyłem na podobne pytania, ale żadne nie dotyczy konkretnie Javy. Nie mogłem zastosować tych rozwiązań, ponieważ najczęściej używane gotos.
Nie chcę umieszczać wewnętrznej pętli w innej metodzie.
Nie chcę ponownie uruchamiać pętli. Po zerwaniu kończę wykonywanie bloku pętli.
java
loops
nested-loops
boutta
źródło
źródło
break
. Nawet wtedy wyjątki są kolejnym bardziej znanym wyjątkiem (przepraszam). Ale nadal byłbym niezadowolony z tego, gdyby nie było to oczywiste (małe pętle, komentarz ostrzegawczy, jeśli etykieta / przerwa wciąż nie są wystarczająco widoczne).outerloop
to etykieta. Nie wiem dokładnie, jakiego kodu próbowałeś, ale kod w mojej odpowiedzi kompiluje się i działa dobrze.Technicznie poprawną odpowiedzią jest oznaczenie zewnętrznej pętli. W praktyce, jeśli chcesz wyjść z dowolnego miejsca w wewnętrznej pętli, lepiej byłoby przekazać kod na zewnątrz (metoda statyczna, jeśli to konieczne), a następnie wywołać go.
Opłaci się to za czytelność.
Kod stałby się mniej więcej taki:
Dopasowując przykład do zaakceptowanej odpowiedzi:
źródło
loop
metodę i wróć z metody, aby kontynuować.Możesz użyć nazwanego bloku wokół pętli:
źródło
name: if(...){...}
warunek jest nazwany? :)for
bezpośrednim oznaczaniem . Możesz dodać kod przed ostatnim,}
który zostanie wykonany tylko wtedy, gdy warunek nigdy nie zostanie spełniony.Nigdy nie używam etykiet. Wydaje się, że jest to zła praktyka. Oto co bym zrobił:
źródło
&& !finished
zamiast|| !finished
? Dlaczego więcbreak
w ogóle używać, a nie używać również&& !finished
do wewnętrznej pętli?break
dowolnie wychodzić z pętli. Jeśli po tymif
bloku jest kod , możesz go wykonaćbreak
. Ale masz rację&&
. Naprawione.Możesz użyć etykiet:
źródło
Użyj funkcji:
źródło
Możesz użyć zmiennej tymczasowej:
W zależności od funkcji możesz także wyjść / wrócić z pętli wewnętrznej:
źródło
Jeśli nie lubisz
break
s igoto
s, możesz użyć „tradycyjnej” pętli for zamiast zamiast for-in, z dodatkowym warunkiem przerwania:źródło
Musiałem zrobić coś podobnego, ale postanowiłem nie używać do tego ulepszonej pętli for.
źródło
s
wartość na niższąi
lub zmienići
na wartość większą lub równą niżs
, obie powinny załatwić sprawę. Masz rację co do zmianys
, ponieważ można go użyć w innym miejscu później, ale zmianai
nie zaszkodzi, po prostu upewni się, że pierwszafor
nie będzie kontynuować pętli.Wolę dodać wyraźne „wyjście” do testów pętli. Dla każdego zwykłego czytelnika jest jasne, że pętla może zakończyć się wcześniej.
źródło
Stream
Rozwiązanie Java 8 :źródło
Zwykle w takich przypadkach wchodzi w zakres bardziej sensownej logiki, powiedzmy, że niektóre szukają lub manipulują niektórymi iterowanymi obiektami „for”, o których mowa, więc zwykle używam podejścia funkcjonalnego:
Główne wady:
Profesjonaliści:
Więc po prostu zajmuje się sprawą za pomocą innego podejścia.
Zasadniczo pytanie do autora tego pytania: co sądzisz o tym podejściu?
źródło
Możesz zerwać ze wszystkich pętli bez użycia etykiet: i flag.
To po prostu trudne rozwiązanie.
Tutaj warunek 1 jest warunkiem, który jest używany do zerwania z pętli K i J. A warunek 2 jest warunkiem, który jest używany do zerwania z pętli K, J i I.
Na przykład:
źródło
(int k = 0; k < 10; k++)
i nie naprawić wszystkie zk = 9
celuk = 10
. Możesz dostać się w nieskończoną pętlę.Koncepcja przerwania z etykietą służy do rozbijania zagnieżdżonych pętli w Javie, przy użyciu przerwania z etykietą można przerwać zagnieżdżanie pętli w dowolnej pozycji. Przykład 1:
załóżmy, że istnieją 3 pętle i chcesz zakończyć pętlę 3: Przykład 2:
źródło
źródło
Jeśli jest w jakiejś funkcji, dlaczego po prostu jej nie zwrócisz:
źródło
Najlepsza i łatwa metoda ..
źródło
Raczej nietypowe podejście, ale pod względem długości kodu ( nie wydajności ) jest to najłatwiejsza rzecz, jaką możesz zrobić:
źródło
Użyj etykiet.
Zobacz ten artykuł
źródło
Kolejne rozwiązanie, wspomniane bez przykładu (faktycznie działa w kodzie prod).
Oczywiście
BreakLoopException
powinny być wewnętrzne, prywatne i przyspieszone bez śledzenia stosu:źródło
for (int j = 0; j < 5; j++) //inner loop
należy zastąpićfor (int j = 0; j < 5 && !exitloops; j++)
.Tutaj, w tym przypadku, pełne zagnieżdżone pętle powinny zostać zakończone, jeśli warunek jest spełniony
True
. Ale jeśli używamyexitloops
tylko do cholewkiloop
Następnie wewnętrzna pętla będzie kontynuowana, ponieważ nie ma dodatkowej flagi, która powiadomiłaby tę wewnętrzną pętlę o wyjściu.
Musi więc używać również
exitloops
do wewnętrznych pętli.źródło
Podobnie jak sugestia @ 1800 INFORMACJE, użyj warunku, który przerywa pętlę wewnętrzną, jako warunku w pętli zewnętrznej:
źródło
Jeśli jest to nowa implementacja, możesz spróbować przepisać logikę jako instrukcje if-else_if-else.
W przeciwnym razie możesz spróbować ustawić flagę po wystąpieniu tego specjalnego warunku i sprawdzić tę flagę w każdym z warunków pętli.
TUTAJ! Tak więc, chociaż prosta przerwa nie będzie działać, można ją wykorzystać do pracy
continue
.Jeśli po prostu przenosisz logikę z jednego języka programowania na Javę i po prostu chcesz, aby coś działało, możesz spróbować użyć etykiet .
źródło
Demo
break
,continue
orazlabel
:Słowa kluczowe Java
break
icontinue
mają wartość domyślną. To „najbliższa pętla”, a dziś, po kilku latach używania Javy, właśnie ją dostałem!Wydaje się, że jest używany rzadko, ale jest użyteczny.
źródło
Próbny
źródło
Możesz wykonać następujące czynności:
ustaw zmienną lokalną na
false
ustaw tę zmienną
true
w pierwszej pętli, gdy chcesz przerwaćnastępnie możesz sprawdzić w zewnętrznej pętli, czy to, czy warunek jest ustawiony, następnie zerwać z zewnętrznej pętli.
źródło
W niektórych przypadkach możemy
while
efektywnie wykorzystać pętlę tutaj.źródło
Java nie ma funkcji goto jak w C ++. Ale nadal
goto
jest zastrzeżonym słowem kluczowym w Javie. Mogą to wdrożyć w przyszłości. W przypadku twojego pytania odpowiedź jest taka, że w Javie istnieje coś takiego jak etykieta, do którego można zastosować instrukcjęcontinue
ibreak
. Znajdź kod poniżej:źródło
Nawet utworzenie flagi dla zewnętrznej pętli i sprawdzenie, że po każdym wykonaniu wewnętrznej pętli może być odpowiedzią.
Lubię to:
źródło
Użyj
condition
jako flagi po zakończeniu przetwarzania. Następnie pętla wewnętrzna jest kontynuowana tylko wtedy, gdy warunek nie jest spełniony. Tak czy inaczej, zewnętrzna pętla będzie się nadal ładować.źródło