У меня есть конструкция вложенного цикла, подобная этой:
for (Type type : types) { for (Type t : types2) { if (some condition) { // Do something and break... break; // Breaks out of the inner loop } } }
Теперь, как я могу выйти из обоих циклов? Я рассматривал похожие вопросы, но ни один из них не касается конкретно Java. Я не смог применить эти решения, потому что большинство использовало goto.
Я не хочу помещать внутренний цикл в другой метод.
Я не хочу возвращать циклы. При разрыве я заканчиваю выполнение блока цикла.
Переведено автоматически
Ответ 1
Как и другие участники ответа, я бы определенно предпочел поместить циклы в другой метод, после чего вы можете просто вернуться, чтобы полностью остановить итерацию. Этот ответ просто показывает, как могут быть выполнены требования, изложенные в вопросе.
Вы можете использовать break с меткой для внешнего цикла. Например:
publicclassTest { publicstaticvoidmain(String[] args) { outerloop: for (int i=0; i < 5; i++) { for (int j=0; j < 5; j++) { if (i * j > 6) { System.out.println("Breaking"); break outerloop; } System.out.println(i + " " + j); } } System.out.println("Done"); } }
Технически правильный ответ - пометить внешний цикл. На практике, если вы хотите завершить работу в любой точке внутреннего цикла, то вам было бы лучше преобразовать код в метод (статический метод, если необходимо), а затем вызвать его.
Это окупилось бы удобочитаемостью.
Код стал бы чем-то вроде этого:
privatestatic String search(...) { for (Type type : types) { for (Type t : types2) { if (some condition) { // Do something and break... return search; } } } returnnull; }
publicstaticvoidloop() { for (inti=0; i < 5; i++) { for (intj=0; j < 5; j++) { if (i * j > 6) { System.out.println("Breaking"); return; } System.out.println(i + " " + j); } } } }
Ответ 3
Вы можете использовать именованный блок вокруг циклов:
search: { for (Type type : types) { for (Type t : types2) { if (some condition) { // Do something and break... break search; } } } }
Ответ 4
Я никогда не использую метки. Кажется, это плохая практика. Вот что я бы сделал:
booleanfinished=false; for (inti=0; i < 5 && !finished; i++) { for (intj=0; j < 5; j++) { if (i * j > 6) { finished = true; break; } } }
Имея переменную flag , мы можем легко контролировать выполнение любого количества циклов, просто нам нужно сохранить проверку значения этого флага в операторе условия цикла, как это сделано в основном цикле-> i < 5 && !завершено.