Как мне выйти из основного / внешнего цикла в двойном / вложенном цикле?

Если у меня есть цикл в цикле, и когда оператор if удовлетворен, я хочу прервать основной цикл, как я должен это сделать?

Это мой код:

for (int d = 0; d < amountOfNeighbors; d++) {
    for (int c = 0; c < myArray.size(); c++) {
        if (graph.isEdge(listOfNeighbors.get(d), c)) {
            if (keyFromValue(c).equals(goalWord)) { // Once this is true I want to break main loop.
                System.out.println("We got to GOAL! It is "+ keyFromValue(c));
                break; // This breaks the second loop, not the main one.
            }
        }
    }
}

person Shepard    schedule 25.10.2012    source источник
comment
используйте этикетку. docs.oracle.com/javase/tutorial/java/nutsandbolts/branch. html   -  person Colin D    schedule 25.10.2012


Ответы (6)


Использование помеченного перерыва:

mainloop:
for(){
 for(){
   if (some condition){
     break mainloop;
   }
  }
}

См. также

person jmj    schedule 25.10.2012
comment
Потрясающий! Я узнал кое-что новое. Я думал, лейблы давно миновали (помните GW-BASIC?). Я бы использовал для этого логические флаги, но ярлыки намного круче! - person ADTC; 25.10.2012
comment
@ADTC GW-BASIC никогда не поддерживал текстовые метки, только числовые номера строк (а они требовались). IIRC, вышедший из Microsoft, именно QuickBASIC добавил поддержку текстовых меток, а также именованных подпрограмм. QBasic, безусловно, включал такую ​​поддержку, если Википедии можно доверять, по крайней мере, не позже, чем Visual Basic. - person user; 26.10.2012

Вы можете добавить метки в свой цикл и использовать это labelled break для выхода из соответствующего цикла: -

outer: for (...) {
    inner: for(...) {
        if (someCondition) {
            break outer;
        }
    }
}

Смотрите эти ссылки для получения дополнительной информации:

person Rohit Jain    schedule 25.10.2012

Вы можете просто return управлять этой функцией. Или воспользуйтесь уродливым break labels подходом :)

Если после вашего оператора for есть другие части кода, вы можете выполнить рефакторинг циклов в функции.

IMO, использование break и continue не рекомендуется в ООП, так как они влияют на удобочитаемость и обслуживание. Конечно, есть случаи, когда они удобны, но в целом я думаю, что нам следует избегать их, поскольку они будут поощрять использование программирования в стиле goto.

Судя по всему, вариаций на этот вопрос публикуется много. Здесь Питер предоставил несколько хороших и необычных способов использования ярлыков.

person dan    schedule 25.10.2012
comment
Источник / защитите свое утверждение о том, что ярлыки уродливы - person John Dvorak; 25.10.2012
comment
В этом конкретном случае возврат может быть уместным. Однако ярлыки не уродливы и часто полезны. - person Colin D; 25.10.2012
comment
@JanDvorak Спасибо, некрасиво и сложно отлаживать. - person dan; 25.10.2012
comment
Я не согласен. Их не сложнее отлаживать, и их тоже не должно быть сложно понять. Я вовсе не считаю их уродливыми. - person John Dvorak; 25.10.2012
comment
@JanDvorak Согласен, наверное, хард оказался слишком сильным :). Я пытался сказать, что код легче читать без логики перехода. - person dan; 25.10.2012
comment
(Я обычно нахожу некоторые языки невыносимо трудными для чтения по другим причинам - я даже не могу вспомнить последний раз, когда я использовал явные двойные циклы, которые требовали взлома на языке, который имел надлежащую поддержку HoF и поддерживающие API-интерфейсы сбора данных. Это было бы намного больше чисто написано с точки зрения функции Any, IMOHO ;-) - person ; 25.10.2012
comment
@pst Согласен. По крайней мере, использование функции поможет ему правильно поддерживать и повторно использовать код. - person dan; 25.10.2012
comment
IMO, хорошо бы переосмыслить, как снова написать код, чтобы избежать помеченных циклов. Причина, по которой так много людей не знают о своем существовании, заключается в том, что они нам не нужны. Я не говорю, что они всегда плохие. - person Bhesh Gurung; 25.10.2012
comment
@BheshGurung Это было то, что я пытался предложить своим ответом, но кажется, что многие до сих пор привыкли к логике goto :) - person dan; 25.10.2012

Похоже, что для Java помеченный перерыв является подходящим вариантом (на основе консенсуса других ответов).

Но для многих (большинства?) Других языков или если вы хотите избежать какого-либо goto потока управления, вам необходимо установить флаг:

bool breakMainLoop = false;
for(){
    for(){
        if (some condition){
            breakMainLoop = true;
            break;
        }
    }
    if (breakMainLoop) break;
}
person Thymine    schedule 25.10.2012
comment
Если помеченный перерыв действительно подходит для Java, то для C / C ++ лучше всего использовать goto. - person Evan Harper; 26.10.2012
comment
Кроме того, вопрос четко обозначен как java. - person user; 26.10.2012
comment
Это не меняет того факта, что кто-то, ищущий «разорвать вложенный цикл», может натолкнуться на это. @EvanHarper Я бы согласился с этой цепочкой рассуждений, но я не провел много времени на Java, поэтому просто согласился с другими ответами ... - person Thymine; 26.10.2012

Просто для развлечения:

for(int d = 0; d < amountOfNeighbors; d++){
    for(int c = 0; c < myArray.size(); c++){
        ...
            d = amountOfNeighbors;
            break;
        ...
    }
    // No code here
}

Комментарий к break label: это прямой переход. Он может прервать любой оператор и перейти к следующему:

foo: // Label the next statement (the block)
{
    code ...
    break foo;  // goto [1]
    code ...
}

//[1]
person irreputable    schedule 25.10.2012
comment
Ошибка синтаксиса. Отсутствует точка с запятой. - person John Dvorak; 25.10.2012
comment
ха-ха :) Обязательно проголосую за это творческое мышление - person Rohit Jain; 25.10.2012
comment
Надеюсь, никто никогда не использует это в продакшене :-) - person John Dvorak; 25.10.2012

Лучшие и простые методы даже для новичков:

outerloop:

for(int i=0; i<10; i++){

    // Here we can break the outer loop by:
    break outerloop;

    innerloop:

    for(int i=0; i<10; i++){

        // Here we can break innerloop by:
        break innerloop;
    }
}
person Keshav bansal    schedule 23.08.2015