Вопрос-ответ

How do I break out of nested loops in Java?

Как мне выйти из вложенных циклов в Java?

У меня есть конструкция вложенного цикла, подобная этой:

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 с меткой для внешнего цикла. Например:

public class Test {
public static void main(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");
}
}

Это выводит:

0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
Breaking
Done
Ответ 2

Технически правильный ответ - пометить внешний цикл. На практике, если вы хотите завершить работу в любой точке внутреннего цикла, то вам было бы лучше преобразовать код в метод (статический метод, если необходимо), а затем вызвать его.

Это окупилось бы удобочитаемостью.

Код стал бы чем-то вроде этого:

private static String search(...) 
{
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
return search;
}
}
}
return null;
}

Соответствие примера принятому ответу:

 public class Test {
public static void main(String[] args) {
loop();
System.out.println("Done");
}

public static void loop() {
for (int i = 0; i < 5; i++) {
for (int j = 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

Я никогда не использую метки. Кажется, это плохая практика. Вот что я бы сделал:

boolean finished = false;
for (int i = 0; i < 5 && !finished; i++) {
for (int j = 0; j < 5; j++) {
if (i * j > 6) {
finished = true;
break;
}
}
}

Имея переменную flag , мы можем легко контролировать выполнение любого количества циклов, просто нам нужно сохранить проверку значения этого флага в операторе условия цикла, как это сделано в основном цикле-> i < 5 && !завершено.

java