Як вийти з вкладених циклів на Java?


1818

У мене вбудована така конструкція циклу:

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

Тепер, як я можу вирватися з обох петель? Я розглядав подібні питання, але жодне не стосується Java. Я не міг застосувати ці рішення, оскільки найчастіше використовуються готи.

Я не хочу ставити внутрішню петлю в інший метод.

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

Відповіді:


2427

Як і інші відповідачі, я, безумовно, вважаю за краще поставити петлі в інший метод, і тоді ви можете просто повернутися, щоб повністю припинити ітерацію. Ця відповідь просто показує, як можна виконати вимоги у питанні.

Можна використовувати 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

286
Це робить стрибок безпосередньо після циклу. Спробуй це! Так, мітка надходить до циклу, але це тому, що це мітка циклу, а не місце, з якого ви хочете вийти. (Ви також можете продовжувати етикетку.)
Джон Скіт

2
Perl також дозволяє це власна система етикеток. Я думаю, що багато мов - навряд чи мене дивує, що це на Яві.
Еван Керролл

9
@Evan - це твердження явно вірно - мовами, які обіцяють, що це правда. Але Java не обіцяє цього. Якщо мова суперечить вашим припущенням, можливо, винні саме ваші припущення. У цьому випадку, я думаю, ви все ще частково праві - принцип, щонайменше, здивує WRT багатьох, хто ніколи не чув (або забув) про цю форму break. Вже тоді винятки - ще один відомий виняток (вибачте). Але я все одно буду незадоволений цим, якби це було не очевидно (невеликі петлі, попереджуючий коментар, якщо ярлик / перерва все ще недостатньо видно).
Steve314

6
@MuhammadBabar: outerloopце мітка. Я не знаю точно, який код ви спробували, але код у моїй відповіді складається і працює чудово.
Джон Скіт

4
@NisargPatil Тільки тому, що він знаходиться в sonarLint, це не робить кодового запаху. Це просто означає, що з’явився розробник, який додав це до sonarLint з особистим сверблячкою, щоб подряпатися, і він сповнений таких правил, які мають сенс лише при зловживанні, або тому, що якийсь розробник має особистий ненависний хрестовий похід проти них. Позначені перерви та продовження - це дуже елегантний спосіб описати, що ви хочете зробити.
john16384

402

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

Це окупиться за читабельність.

Код став би таким:

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);
            }
        }
    }
}

30
Іноді ви використовуєте кілька локальних змінних, що знаходяться поза внутрішньої петлі, передаючи їх усім, можна відчути незграбність.
Хаост

1
То як у цьому рішенні слід надрукувати "Готово", як у прийнятій відповіді?
JohnDoe

1
@JohnDoe ви його викликаєте, а потім друкуєте System.out.println ("зроблено"); спробуйте {} нарешті {} в рамках способу пошуку також є опцією.
Зо72

2
Я вважаю, що це найкраща практика, але що станеться, якщо ви хочете продовжувати, а не ламати? Мітки підтримують однаково добре (або погано!), Але я не впевнений, як конвертувати цю логіку для продовження.
Роб Грант

@RobertGrant Якщо ви хочете продовжувати замість розриву, перемістіть зовнішній цикл поза loopметодом і поверніться з методу для продовження.
Muhd

215

Ви можете використовувати названий блок навколо циклів:

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

40
Вам не потрібно створювати новий блок, щоб використовувати мітку.
Джон Скіт

81
Ні, але це робить наміри набагато зрозумілішими. Дивіться перший коментар до прийнятої відповіді.
Бомбе

2
це насправді не названий блок, після мітки ви можете писати будь-який вираз Java як без мітки, чи name: if(...){...}робить умову названою :)
La VloZ Merrill

4
Ця конструкція має велику перевагу перед маркуванням forбезпосередньо. Ви можете додати код до останнього, }який буде виконаний, лише якщо умова ніколи не була виконана.
Флоріан F

2
Це іменований блок, а не іменний цикл. Ви не могли в цьому циклі "продовжити пошук". що є абсолютно юридичним синтаксисом, якщо цикл названий search. Ви можете зламати її, але не можете продовжувати.
Татариз

132

Я ніколи не використовую етикетки. Це здається поганою практикою потрапляти. Ось що я б робив:

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;
        }
    }
}

4
Чи не повинно бути це && !finishedзамість || !finished? І чому тоді breakвзагалі використовувати, а не використовувати і && !finishedдля внутрішньої петлі?
Гандальф

4
Я використовую, breakщоб мати можливість довільно вийти з циклу. Якщо після цього ifблоку є код , ви можете breakперед його виконанням. Але ти маєш рацію &&. Виправлено це.
Elle Mundy

2
приємне рішення! саме так я б це робив на практиці, якщо розміщення його в додатковій функції чомусь не є кращим.
Бенрот

6
Можлива проблема, якщо після внутрішньої петлі буде певна логіка ... яка буде продовжувати виконуватись, а зовнішня петля розривається лише тоді, коли розпочнеться нова ітерація ...
Karthik Karuppannan,

7
Я не розумію, чому слід робити це так. Люди, які працюють з кодом, повинні мати можливість використовувати всі функції мови. Я розумію, що важливо писати код, який інші можуть зрозуміти, але не обмежуючи використання офіційних інструментів, що надаються мовою, і знаходять обхідні шляхи для тієї ж функціональності. Або ви мали на увазі щось інше під «поганою практикою»?
codepleb

107

Ви можете використовувати мітки:

label1: 
for (int i = 0;;) {
    for (int g = 0;;) {
      break label1;
    }
}

4
Майте +1 від мене. Простий, до речі, відповідає на питання. Не можна звинувачувати у повторенні наявної відповіді, оскільки ви відповіли одночасно.
Хеймдалл

40

Використовуйте функцію:

public void doSomething(List<Type> types, List<Type> types2){
  for(Type t1 : types){
    for (Type t : types2) {
      if (some condition) {
         // Do something and return...
         return;
      }
    }
  }
}

20

Ви можете використовувати тимчасову змінну:

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

Залежно від функції, ви також можете вийти / повернутися із внутрішнього циклу:

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

7
Я вважаю цей спосіб затиснутим.
бутта

11
Перевірка додаткової умови щоразу через цикл? Ні, дякую.
ryandenki

15

Якщо вам не подобаються breaks і gotos, ви можете використовувати "традиційний" цикл замість for-in, з додатковою умовою переривання:

int a, b;
bool abort = false;
for (a = 0; a < 10 && !abort; a++) {
    for (b = 0; b < 10 && !abort; b++) {
        if (condition) {
            doSomeThing();
            abort = true;
        }
    }
}

2
Не підходить для проривання петель.
Джон Макклайн

1
@JohnMcClane І ти спамуєш це на багато відповідей на запитання, пов’язані з 9 років, тому що ...?
Квінтек

12

Мені потрібно було зробити подібну річ, але я вирішив не використовувати розширений цикл для цього.

int s = type.size();
for (int i = 0; i < s; i++) {
    for (int j = 0; j < t.size(); j++) {
        if (condition) {
            // do stuff after which you want 
            // to completely break out of both loops
            s = 0; // enables the _main_ loop to terminate
            break;
        }
    }
}

Я не вважаю здоровим повторювати всі предмети після порушення умови. Таким чином, я б додав перерву в іншому випадку.
бутта

@boutta Я не впевнений, як ви до цього висновку. Як тільки умова виконується, обидві петлі закінчуються.
Swifty McSwifterton

Гаразд, я не зрозумів, що маніпулював варом 's'. Але я вважаю такий поганий стиль, оскільки s представляє розмір. Тоді я віддаю перевагу відповідь від ddyer з явними змінними: stackoverflow.com/a/25124317/15108
boutta

@boutta Ви можете змінити sзначення, яке є нижчим iабо змінити iзначення, яке більше або рівне, ніж sобидва, повинні зробити фокус. Ви маєте рацію щодо зміни s, оскільки її можна використовувати в іншому місці пізніше, але зміна iне зашкодить, просто переконайтеся, що перший forне продовжить циклічно.
Zsolti

9

Я вважаю за краще додати явний "вихід" до тестів циклу. Будь-який випадковий читач дає зрозуміти, що цикл може закінчитися достроково.

boolean earlyExit = false;
for(int i = 0 ; i < 10 && !earlyExit; i++) {
     for(int j = 0 ; i < 10 && !earlyExit; j++) { earlyExit = true; }
}

Не підходить для проривання петель.
Джон Макклайн

8

StreamРішення Java 8 :

List<Type> types1 = ...
List<Type> types2 = ...

types1.stream()
      .flatMap(type1 -> types2.stream().map(type2 -> new Type[]{type1, type2}))
      .filter(types -> /**some condition**/)
      .findFirst()
      .ifPresent(types -> /**do something**/);

1
@ Tvde1 і досі корисний для інших користувачів, тому нові методи та рішення завжди вітаються
Андрій Суворков,

Ого, це некрасиво.
ДС.

7

Зазвичай у таких випадках вона входить у сферу більш значущої логіки, скажімо, пошук або маніпулювання деякими ітераційними 'об'єктами', про які йдеться, тому я зазвичай використовую функціональний підхід:

public Object searching(Object[] types) { // Or manipulating
    List<Object> typesReferences = new ArrayList<Object>();
    List<Object> typesReferences2 = new ArrayList<Object>();

    for (Object type : typesReferences) {
        Object o = getByCriterion(typesReferences2, type);
        if(o != null) return o;
    }
    return null;
}

private Object getByCriterion(List<Object> typesReferences2, Object criterion) {
    for (Object typeReference : typesReferences2) {
        if(typeReference.equals(criterion)) {
             // here comes other complex or specific logic || typeReference.equals(new Object())
             return typeReference;
        }
    }
    return null;
}

Основні мінуси:

  • приблизно в два рази більше рядків
  • більше споживання обчислювальних циклів, тобто з алгоритмічної точки зору воно повільніше
  • більше друкарської роботи

Плюси:

  • більш високе відношення до розділення проблем через функціональну деталізацію
  • більш високе співвідношення повторної використання та контролю логіки пошуку / маніпулювання без
  • методи не довгі, тому вони більш компактні та легкі для розуміння
  • більш високе співвідношення читабельності

Тож це просто розгляд справи за допомогою іншого підходу.

В основному питання до автора цього питання: що ви вважаєте таким підходом?


6

Ви можете перерватися з усіх циклів, не використовуючи позначок: і прапорів.

Це просто хитре рішення.

Тут умова1 - це умова, яка використовується для відриву від циклу K і J.

Наприклад:

public class BreakTesting {
    public static void main(String[] args) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                for (int k = 0; k < 9; k++) {
                    if (condition1) {
                        System.out.println("Breaking from Loop K and J");
                        k = 9;
                        j = 9;
                    }
                    if (condition2) {
                        System.out.println("Breaking from Loop K, J and I");
                        k = 9;
                        j = 9;
                        i = 9;
                    }
                }
            }
        }
        System.out.println("End of I , J , K");
    }
}

2
Як я можу це використовувати для кожного циклу? ;)
Віллі Ментцель

5
Це не працює, якщо у вас є складніший стан циклу, наприклад list.size ()> 5. Крім того, це справді просто злом. Важко читати і погана практика!
Нейрон

Він схильний до помилок. Уявіть , що ви змінили внутрішню петлю , щоб (int k = 0; k < 10; k++)і ви не виправити все з k = 9до k = 10. Ви можете потрапити в нескінченну петлю.
Флоріан F

5

Мічений перерву концепція використовуються , щоб вирватися з вкладених циклів в Java, за допомогою міченого перерви ви можете розбити вкладеності циклів в будь-якому положенні. Приклад 1:

loop1:
 for(int i= 0; i<6; i++){
    for(int j=0; j<5; j++){
          if(i==3)
            break loop1;
        }
    }

припустимо, є 3 петлі, і ви хочете припинити цикл3: Приклад 2:

loop3: 
for(int i= 0; i<6; i++){
loop2:
  for(int k= 0; k<6; k++){
loop1:
    for(int j=0; j<5; j++){
          if(i==3)
            break loop3;
        }
    }
}

4
boolean broken = false; // declared outside of the loop for efficiency
for (Type type : types) {
    for (Type t : types2) {
        if (some condition) {
            broken = true;
            break;
        }
    }

    if (broken) {
        break;
    }
}

4

Якщо це всередині якоїсь функції, чому б просто не повернути її:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
            return value;
         }
    }
}

Я віддаю перевагу цій схемі. Часто це викликало у мене розрив циклів на окрему функцію. Мій код завжди був кращим після цього, тому з цієї причини мені дуже подобається ця відповідь.
Білл К

4

Найкращий і простий метод ..

outerloop:
for(int i=0; i<10; i++){
    // here we can break Outer loop by 
    break outerloop;

    innerloop:
    for(int i=0; i<10; i++){
        // here we can break innerloop by 
        break innerloop;
     }
}

4
Ці приклади зламу не дуже корисні, оскільки навіть без етикетки вони б зламалися в той же момент. Крім того, завжди приємно мати код, який ви можете реально виконати, що не стосується вашого коду, оскільки внутрішній цикл ніколи не може бути досягнутий ..
Neuron

Я збирався набрати те саме. Етикетки в цьому випадку дещо марні.
Таслім Осені

4

Досить незвичний підхід, але з точки зору довжини коду (а не продуктивності ) це найпростіша річ, яку ви могли зробити:

for(int i = 0; i++; i < j) {
    if(wanna exit) {
        i = i + j; // if more nested, also add the 
                   // maximum value for the other loops
    }
}


4

Ще одне рішення, згадане без прикладу (воно фактично працює в коді prod).

try {
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition #1) {
                // Do something and break the loop.
                throw new BreakLoopException();
            }
        }
    }
}
catch (BreakLoopException e) {
    // Do something on look breaking.
}

Звичайно, BreakLoopExceptionслід бути внутрішнім, приватним та прискорюватись без сліду:

private static class BreakLoopException extends Exception {
    @Override
    public StackTraceElement[] getStackTrace() {
        return new StackTraceElement[0];
    }
}

1
Про це було сказано фактично у відповіді, яка отримала -23 голоси ... stackoverflow.com/a/886980/2516301 . Це зробить роботу, але це дуже погана практика програмування ...
vefthym

справді. однак я бачив такий застарілий код - 4-рівневі вкладені петлі з кількома умовами розриву. і це було читабельніше за винятками, а не з вбудованим кодом. -23 голоси - це переважно емоційна оцінка, але так - цей підхід слід використовувати обережно.
ursa

1
Це було б ще читабельніше, якби воно було розбито на окремий виклик функції з центром повернення. Часто робиться ще кращим за допомогою невеликого рефактора, тому він має сенс як окрема (часто багаторазова) функція.
Білл К

2

for (int j = 0; j < 5; j++) //inner loopслід замінити на for (int j = 0; j < 5 && !exitloops; j++).

Тут у цьому випадку завершені вкладені петлі повинні бути вихідними, якщо умова є True. Але якщо ми використовуємо exitloopsлише верхнійloop

 for (int i = 0; i < 5 && !exitloops; i++) //upper loop

Тоді внутрішній цикл триватиме, оскільки немає жодного додаткового прапора, який сповіщав би цей внутрішній цикл про вихід.

Приклад: якщо i = 3і j=2тоді умова є false. Але в наступній ітерації внутрішньої петлі j=3 тоді (i*j)стане умовою, 9яка є, trueале внутрішня петля буде продовжуватися, поки не jстане 5.

Отже, він повинен використовуватись і exitloopsдля внутрішніх петель.

boolean exitloops = false;
for (int i = 0; i < 5 && !exitloops; i++) { //here should exitloops as a Conditional Statement to get out from the loops if exitloops become true. 
    for (int j = 0; j < 5 && !exitloops; j++) { //here should also use exitloops as a Conditional Statement. 
        if (i * j > 6) {
            exitloops = true;
            System.out.println("Inner loop still Continues For i * j is => "+i*j);
            break;
        }
        System.out.println(i*j);
    }
}

2

Як @ 1800 ІНФОРМАЦІЙНА пропозиція, використовуйте умову, яка порушує внутрішню петлю, як умову зовнішньої петлі:

boolean hasAccess = false;
for (int i = 0; i < x && hasAccess == false; i++){
    for (int j = 0; j < y; j++){
        if (condition == true){
            hasAccess = true;
            break;
        }
    }
}

2

Якщо це нова реалізація, ви можете спробувати переписати логіку як if-else_if-else твердження.

while(keep_going) {

    if(keep_going && condition_one_holds) {
        // Code
    }
    if(keep_going && condition_two_holds) {
        // Code
    }
    if(keep_going && condition_three_holds) {
        // Code
    }
    if(keep_going && something_goes_really_bad) {
        keep_going=false;
    }
    if(keep_going && condition_four_holds) {
        // Code
    }
    if(keep_going && condition_five_holds) {
        // Code
    }
}

В іншому випадку ви можете спробувати встановити прапор, коли ця особлива умова настала, і перевірити його на кожному з ваших умов циклу.

something_bad_has_happened = false;
while(something is true && !something_bad_has_happened){
    // Code, things happen
    while(something else && !something_bad_has_happened){
        // Lots of code, things happens
        if(something happened){
            -> Then control should be returned ->
            something_bad_has_happened=true;
            continue;
        }
    }
    if(something_bad_has_happened) { // The things below will not be executed
        continue;
    }

    // Other things may happen here as well, but they will not be executed
    //  once control is returned from the inner cycle.
}

ТУТ! Отже, хоча проста перерва не вийде, її можна зробити для роботи, використовуючи continue.

Якщо ви просто переносите логіку з однієї мови програмування на Java і просто хочете, щоб справа працювала, ви можете спробувати використовувати мітки .


2

Демо для break, continueі label:

Ключові слова Java breakі continueмають значення за замовчуванням. Це "найближчий цикл", і сьогодні, через кілька років використання Java, я щойно отримав це!

Здається, використовується рідко, але корисно.

import org.junit.Test;

/**
 * Created by cui on 17-5-4.
 */

public class BranchLabel {
    @Test
    public void test() {
        System.out.println("testBreak");
        testBreak();

        System.out.println("testBreakLabel");
        testBreakLabel();

        System.out.println("testContinue");
        testContinue();
        System.out.println("testContinueLabel");
        testContinueLabel();
    }

    /**
     testBreak
     a=0,b=0
     a=0,b=1
     a=1,b=0
     a=1,b=1
     a=2,b=0
     a=2,b=1
     a=3,b=0
     a=3,b=1
     a=4,b=0
     a=4,b=1
     */
    public void testBreak() {
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                if (b == 2) {
                    break;
                }
                System.out.println("a=" + a + ",b=" + b);
            }
        }
    }

    /**
     testContinue
     a=0,b=0
     a=0,b=1
     a=0,b=3
     a=0,b=4
     a=1,b=0
     a=1,b=1
     a=1,b=3
     a=1,b=4
     a=2,b=0
     a=2,b=1
     a=2,b=3
     a=2,b=4
     a=3,b=0
     a=3,b=1
     a=3,b=3
     a=3,b=4
     a=4,b=0
     a=4,b=1
     a=4,b=3
     a=4,b=4
     */
    public void testContinue() {
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                if (b == 2) {
                    continue;
                }
                System.out.println("a=" + a + ",b=" + b);
            }
        }
    }

    /**
     testBreakLabel
     a=0,b=0,c=0
     a=0,b=0,c=1
     * */
    public void testBreakLabel() {
        anyName:
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                for (int c = 0; c < 5; c++) {
                    if (c == 2) {
                        break anyName;
                    }
                    System.out.println("a=" + a + ",b=" + b + ",c=" + c);
                }
            }
        }
    }

    /**
     testContinueLabel
     a=0,b=0,c=0
     a=0,b=0,c=1
     a=1,b=0,c=0
     a=1,b=0,c=1
     a=2,b=0,c=0
     a=2,b=0,c=1
     a=3,b=0,c=0
     a=3,b=0,c=1
     a=4,b=0,c=0
     a=4,b=0,c=1
     */
    public void testContinueLabel() {
        anyName:
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                for (int c = 0; c < 5; c++) {
                    if (c == 2) {
                        continue anyName;
                    }
                    System.out.println("a=" + a + ",b=" + b + ",c=" + c);
                }
            }
        }
    }
}


1

Ви можете зробити наступне:

  1. встановити локальну змінну на false

  2. встановіть цю змінну trueв першому циклі, коли ви хочете зламати

  3. тоді ви можете перевірити у зовнішній петлі, чи встановлено умову, а також перервіться із зовнішньої петлі.

    boolean isBreakNeeded = false;
    for (int i = 0; i < some.length; i++) {
        for (int j = 0; j < some.lengthasWell; j++) {
            //want to set variable if (){
            isBreakNeeded = true;
            break;
        }
    
        if (isBreakNeeded) {
            break; //will make you break from the outer loop as well
        }
    }

1

У деяких випадках тут ми можемо whileефективно використовувати цикл.

Random rand = new Random();
// Just an example
for (int k = 0; k < 10; ++k) {
    int count = 0;
    while (!(rand.nextInt(200) == 100)) {
       count++;
    }

    results[k] = count;
}

1

У Java немає функції goto, як це є в C ++. Але все ж, gotoце зарезервоване ключове слово на Java. Вони можуть це впровадити в майбутньому. На ваше запитання, відповідь полягає в тому, що в Java є щось, що називається ярликом, до якого можна застосувати a 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");
}

1

Навіть створивши прапор для зовнішньої петлі і перевіривши, що після кожного виконання внутрішнього циклу може бути відповіддю.

Подобається це:

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

1
boolean condition = false;
for (Type type : types) {
    for (int i = 0; i < otherTypes.size && !condition; i ++) {
        condition = true; // If your condition is satisfied
    }
}

Використовуйте conditionяк прапор, коли ви закінчите обробку. Тоді внутрішня петля продовжується лише тоді, коли умова не виконана. Так чи інакше, зовнішня петля буде тримати чаггін '.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.