У меня есть конструкция вложенного цикла, как это:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break; // Breaks out of the inner loop
}
}
}
Теперь, как я могу вырваться из обеих петель? Я смотрел на похожие вопросы, но ни один из них не касается конкретно Java. Я не мог применить эти решения, потому что большинство использовали gotos.
Я не хочу помещать внутренний цикл в другой метод.
Я не хочу перезапускать циклы. При разрыве я заканчиваю выполнение цикла цикла.
java
loops
nested-loops
boutta
источник
источник
break
. Даже тогда исключения являются еще одним известным исключением (извините). Но я все еще был бы недоволен этим, если бы это не было очевидно (небольшие циклы, предупреждающий комментарий, если метка / разрыв все еще недостаточно видны).outerloop
это лейбл. Я не знаю точно, какой код вы пробовали, но код в моем ответе компилируется и работает просто отлично.Технически правильный ответ - обозначить внешний цикл. На практике, если вы хотите выйти в любой точке внутреннего цикла, вам лучше было бы перенести код в метод (статический метод, если это необходимо), а затем вызвать его.
Это окупится за удобочитаемость.
Код станет примерно таким:
Соответствие примеру для принятого ответа:
источник
loop
метода и вернитесь из метода для продолжения.Вы можете использовать именованный блок вокруг циклов:
источник
name: if(...){...}
делает ли названное условие? :)for
прямой маркировкой . Вы можете добавить код перед последним,}
который будет выполнен, только если условие никогда не выполнялось.Я никогда не использую ярлыки. Кажется, это плохая практика. Вот что я бы сделал:
источник
&& !finished
вместо|| !finished
? А зачем тогдаbreak
вообще использовать и не использовать&& !finished
для внутреннего цикла тоже?break
чтобы иметь возможность произвольно выйти из цикла. Если после этогоif
блока есть код , вы можетеbreak
выполнить его до выполнения. Но ты прав&&
. Починил это.Вы можете использовать метки:
источник
Используйте функцию:
источник
Вы можете использовать временную переменную:
В зависимости от вашей функции вы также можете выйти / вернуться из внутреннего цикла:
источник
Если вам не нравятся
break
s иgoto
s, вы можете использовать «традиционный» цикл for вместо for-in с дополнительным условием прерывания:источник
Мне нужно было сделать похожую вещь, но я решил не использовать расширенный цикл for, чтобы сделать это.
источник
s
на значение, которое меньшеi
или изменитьi
на значение, большее или равноеs
, оба должны делать свое дело. Вы правы насчет измененияs
, потому что позже его можно будет использовать в другом месте, но изменениеi
не повредит, просто убедится, что первоеfor
не продолжит цикл.Я предпочитаю добавить явный «выход» к тестам цикла. Любой случайный читатель дает понять, что цикл может закончиться рано.
источник
Stream
Решение Java 8 :источник
Обычно в таких случаях это входит в сферу более значимой логики, скажем, некоторого поиска или манипулирования некоторыми итеративными объектами for, о которых идет речь, поэтому я обычно использую функциональный подход:
Основные минусы:
Плюсы:
Так что это просто обработка дела с помощью другого подхода.
В основном вопрос к автору этого вопроса: что вы думаете об этом подходе?
источник
Вы можете выйти из всех циклов, не используя метки: и флаги.
Это просто хитрое решение.
Здесь условие 1 - это условие, которое используется для разрыва цикла K и J. И условие 2 - это условие, которое используется для разрыва цикла K, J и I.
Например:
источник
(int k = 0; k < 10; k++)
и вы не исправили всеk = 9
наk = 10
. Вы можете попасть в бесконечный цикл.Меченый перерыв концепция используются , чтобы вырваться из вложенных циклов в Java, с помощью меченого перерыва вы можете разбить вложенности циклов в любом положении. Пример 1:
предположим, что есть 3 цикла, и вы хотите завершить цикл 3: Пример 2:
источник
источник
Если это внутри какой-то функции, почему бы вам просто не вернуть ее:
источник
Лучший и простой метод ..
источник
Довольно необычный подход, но с точки зрения длины кода ( не производительности ) это самое простое, что вы можете сделать:
источник
Используйте ярлыки.
Обратитесь к этой статье
источник
Другое решение, упомянутое без примера (на самом деле оно работает в коде prod).
Конечно, он
BreakLoopException
должен быть внутренним, частным и ускоренным без отслеживания стека:источник
for (int j = 0; j < 5; j++) //inner loop
следует заменить наfor (int j = 0; j < 5 && !exitloops; j++)
.Здесь, в этом случае завершенные вложенные циклы должны быть завершены, если условие выполнено
True
. Но если мы используемexitloops
только верхнийloop
Затем внутренний цикл продолжится, потому что нет никакого дополнительного флага, который уведомит этот внутренний цикл о выходе.
Таким образом, он должен использовать
exitloops
для внутренних циклов тоже.источник
Как и предложение @ 1800 INFORMATION, используйте условие, которое разрывает внутренний цикл, как условие на внешний цикл:
источник
Если это новая реализация, вы можете попробовать переписать логику в виде операторов if-else_if-else.
В противном случае вы можете попробовать установить флаг, когда это специальное условие произошло, и проверить его в каждом из ваших условий цикла.
ВОТ! Таким образом, хотя простой перерыв не сработает, его можно использовать для работы
continue
.Если вы просто переносите логику с одного языка программирования на Java и просто хотите, чтобы все заработало, вы можете попробовать использовать метки .
источник
Демо для
break
,continue
иlabel
:Ключевые слова Java
break
иcontinue
имеют значение по умолчанию. Это «ближайший цикл», и сегодня, после нескольких лет использования Java, я только что понял!Кажется, используется редко, но полезно.
источник
демонстрация
источник
Вы можете сделать следующее:
установить локальную переменную в
false
установите эту переменную
true
в первом цикле, когда вы хотите прерватьтогда вы можете проверить во внешнем цикле, что, если условие установлено, то и выход из внешнего цикла тоже.
источник
В некоторых случаях мы можем
while
эффективно использовать цикл здесь.источник
В Java нет функции перехода, как в C ++. Но все же,
goto
это зарезервированное ключевое слово в Java. Они могут реализовать это в будущем. На ваш вопрос ответ таков: в Java есть нечто, называемое меткой, к которой вы можете применить операторcontinue
andbreak
. Найдите код ниже:источник
Даже создание флага для внешнего цикла и проверка того, что после каждого выполнения внутреннего цикла может быть ответом.
Нравится:
источник
Используйте
condition
в качестве флага, когда вы закончите обработку. Тогда внутренний цикл только продолжается, пока условие не было выполнено. В любом случае, внешний цикл будет продолжать chuggin '.источник