Как вырваться из вложенных циклов в Java? - PullRequest
1689 голосов
/ 20 мая 2009

У меня есть конструкция с вложенным циклом:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             break; // Breaks out of the inner loop
         }
    }
}

Теперь, как мне вырваться из обеих петель? Я смотрел на похожие вопросы, но ни один из них не касается конкретно Java. Я не мог применить эти решения, потому что большинство использовало gotos.

Я не хочу помещать внутренний цикл в другой метод.

Я не хочу перезапускать циклы. При разрыве я заканчиваю выполнение блока цикла.

Ответы [ 33 ]

0 голосов
/ 04 августа 2018

В Java нет функции перехода, как в C ++. Но все же, goto является зарезервированным ключевым словом в Java. Они могут реализовать это в будущем. На ваш вопрос ответ таков: в Java есть нечто, называемое меткой, к которой вы можете применить операторы continue и break. Найдите код ниже:

public static void main(String ...args) {
    outerLoop: for(int i=0;i<10;i++) {
    for(int j=10;j>0;j--) {
        System.out.println(i+" "+j);
        if(i==j) {
            System.out.println("Condition Fulfilled");
            break outerLoop;
        }
    }
    }
    System.out.println("Got out of the outer loop");
}
0 голосов
/ 17 октября 2012

Вы просто используете метку для разрыва внутренних петель

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 голосов
/ 31 марта 2016

Я чувствую, что использование меток делает код очень похожим на оператор goto. Это всего лишь мысль.

Вместо этого выведите исключение во внутренний цикл for и инкапсулируйте два цикла for с помощью блока try catch.

Что-то вроде

try {
  // ...
  for(Object outerForLoop : objectsOuter) {
     // ...
     for (Object innerForLoop : objectsInner) {
        // ...
        if (isConditionTrue)
             throw new WrappedException("With some useful message. Probably some logging as well.");
     }
  }
  catch (WrappedException) {
        // Do something awesome or just don't do anything to swallow the exception.
  }

Просто мысль. Я предпочитаю этот код, так как он дает мне лучшую регистрацию (как это слово) для меня, когда он запускается в производстве или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...