Использовать break в цикле for или нет? - PullRequest
2 голосов
/ 20 октября 2010

Всего один быстрый вопрос, скажем, класс Car расширяет HashMap (String, String).

1

for (Car car : carList) {
    if (car.isEmpty) {
        break;
    }
    doSomething();
}

2

for (Car car : carList) {
    if (!car.isEmpty) {
        doSomethingElse();
    }
}

Какой из двух вышеупомянутых лучше? Спасибо.

---- отредактировано ---- Извините, я не прояснил свою точку зрения.

Метод doSomething () на самом деле делает разные вещи. Я изменил их на doSomething () и doSometingElse ().

Мой вопрос, вы поместите весь процесс в один if ()? или сначала прервите цикл, если условие if () не удовлетворяет.

Спасибо.

Ответы [ 8 ]

8 голосов
/ 20 октября 2010

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

Изменение break на continue в первом вызоветони работают одинаково.

1 голос
/ 20 октября 2010

Они делают совершенно разные вещи. Первый остановится, увидев первую пустую машину. Вторая версия будет «делать что-то» для каждой непустой машины. Я думаю, вы можете использовать оператор continue вместо break.

0 голосов
/ 20 октября 2010

Это то, что вы ищете?

for (Car car : carList) {
    if (car.isEmpty) {
         doSomething();
    }
    else {
         doSomethingElse();
    }       
}

Или вы ищете

for (Car car : carList) {
    if (car.isEmpty) {
       break; 
       //STOP ITERATING THROUGH THE REST OF THE LIST 
       //(doSomething & soSomethingElse may have been called a few times already)
    }
    else {
        doSomething();
    }
    doSomethingElse();
}

Есть и другие варианты, ваше разъяснение до сих пор не ясно ... для меня все равно ...

0 голосов
/ 20 октября 2010

Как все отметили, версия для прерывания выйдет рано. Ответ зависит от того, что вы хотите от него сделать.

Если вы закончили делать то, что вам нужно сделать, то вырвитесь, как только закончите. Зачем тратить циклы процессора? с другой стороны, если вам нужно пройти весь список до dosomethingelse (), тогда не пренебрегайте.

Было ли у вас две разные именованные функции или они обе должны называться dosomething ()?

0 голосов
/ 20 октября 2010

Если вы хотите другое поведение в зависимости от того, пуста машина или нет, вы можете использовать оператор if else.Используйте break, если вы хотите остановить итерацию carList.

for (Car car : carList) {
   if (car.isEmpty) {
      doSomething();
   }
   else {
      doSomethingElse();
   }
}
0 голосов
/ 20 октября 2010

Если бы вы на самом деле имели в виду «продолжить», а не «прервать», то я бы сказал, что не использовать «продолжить» или «перерыв» лучше.

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

Это не очень большое дело, и много раз эти структуры действительно проясняют ваш код, но если у вас есть выбор, и они, по-видимому, делают по сути то же самое, идите по пути, который не подразумевает отправку контроля в другое место.

0 голосов
/ 20 октября 2010

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

0 голосов
/ 20 октября 2010

Эти 2 цикла не делают одно и то же

  1. прервет цикл при первом обнаружении пустого автомобиля с isEmpty, пропускающего все автомобили после первого пустого.Вы можете сделать эту работу как 2. Если вы измените 'break' на 'continue'

  2. сделает что-то для всех не пустых автомобилей.

...