Вопрос

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

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

      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 ... loop. Итак, я использовал перерыв в моем коде. Но я не совсем уверен, правда ли это. Для всех петель или только для второй петли?

Это было полезно?

Решение

Это разбивает только внутреннюю петлю, и поэтому делает то, что вы хотите. Чтобы разбить более одного уровня, в 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 до Но не в том числе указанный.

Другие советы

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

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

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

break только выходит из внутренней петли.

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

Просто второй. Вы можете использовать «goto», конечно.

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

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

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

Как насчет использования логика, вы называете «нашли» и используете это так:

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

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

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

                   k =  stationen.length + 1 ;

                }
            }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top