Перерыв в вложенных циклах

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

У меня следующая ситуация:

      for(int i = 0; i < schiffe.length-1; i++){
            if(schiffe[i].schaden){
                schlepper.fliege(schiffe[i].x, 
                                 schiffe[i].y, 
                                 schiffe[i].z);
                schlepper.wirdAbgeschleppt = schiffe[i];
                for(int k = 0; k < stationen.length-1; k++){
                    if(stationen[k].reparatur == null){
                        schlepper.fliege(stationen[k].x,
                                         stationen[k].y,
                                         stationen[k].z);
                        break;
                    }
                }
            }
        }

Я хочу

schlepper.fliege(stationen[k].x,
                 stationen[k].y,
                 stationen[k].z);

выполняться один раз, а затем выходить из внутреннего цикла и продолжать цикл for (int i... Итак, я использовал разрыв в моем коде. Но я не уверен, правильно ли это. вызвать разрыв для всех циклов или только для второго цикла?

Ответы

Ответ 1

Он разбивает только внутренний цикл и, следовательно, делает то, что вы хотите. Чтобы разбить более одного уровня на Java, вы можете использовать "помеченный разрыв" следующим образом:

schiffe_loop:
for(int i = 0; i < schiffe.length-1; i++){
    some_stuff();
    for(int k = 0; k < stationen.length-1; k++){
        if (something_really_bad_happened()) {
            break schiffe_loop;
        }
    }
}

Но обычно вам это не понадобится.

В любом случае вы можете рассмотреть возможность создания отдельного метода для внутреннего цикла; это то, что вы можете легко дать имя ( "find_available_station" или что-то в этом роде), и, вероятно, потребуется где-то еще.

Кроме того, помните, что ваши петли прямо сейчас пропустят последний элемент каждого массива. Подумайте о том, почему вы используете < вместо < =; это точно так, что вы используете каждое значение от 0 до , но не включая указанный.

Ответ 2

break разрушит самый внутренний цикл, в вашем случае 2-й цикл.

Чтобы разбить внешний цикл, вы можете использовать помеченный перерыв как:

OUTER:for(...) {
         for(...) {
            break OUTER;
         }
      }

Ответ 3

break только вырывается из самого внутреннего цикла.

Ответ 4

break вызовет разрыв только для ближайшего цикла (второй цикл)

Ответ 5

Просто второй. Конечно, вы можете использовать "goto".

Ответ 6

Оператор break завершает ближайший замкнутый цикл или оператор switch, в котором он отображается на многих языках, но вы можете попробовать его и убедиться, что 100%.

Ответ 7

поместите внутренние две петли в функцию и используйте return, чтобы вырваться из них обоих.

Ответ 8

Если вам нужно больше контроля, вы можете использовать помеченный перерыв. Подробнее здесь. Как говорили другие, break закроет ближайший цикл.

Ответ 9

Как насчет использования логического вызова, которое вы вызываете "найденным", и используйте его следующим образом:

while(!found) {
    for(...) {
        //todo
    }
}

Ответ 10

Думаю, вы можете сделать еще одну вещь..

для (int k = 0; k < stationen.length-1; k ++) {                   if (stationen [k].reparatur == null) {                       schlepper.fliege(Stationen [к].x,                                        Stationen [к].y,                                        Stationen [к].z);

                   k =  stationen.length + 1 ;

                }
            }