Итерировать с помощью цикла for или while? - PullRequest
40 голосов
/ 19 сентября 2008

Я часто вижу код вроде:

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

но я пишу это (когда Java 1.5 недоступна или не может использоваться для каждого) как:

for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

потому что

  • короче
  • Сохраняет i в меньшем объеме
  • Уменьшает вероятность путаницы. (i используется вне в то время как? Где объявлено i?

Я думаю, что код должен быть настолько простым для понимания, насколько это возможно, так что мне нужно только создавать сложный код, чтобы делать сложные вещи. Как вы думаете? Что лучше?

От: http://jamesjava.blogspot.com/2006/04/iterating.html

Ответы [ 15 ]

81 голосов
/ 19 сентября 2008

Я предпочитаю цикл for, поскольку он также устанавливает область действия итератора только для цикла for.

10 голосов
/ 19 сентября 2008

Существуют соответствующие варианты использования конструкций while, for и foreach:

  • while - используйте это, если вы выполняете итерацию, и решающий фактор для цикла или нет основан только на условии. В этой конструкции цикла поддержание индекса является лишь второстепенной задачей; все должно основываться на условии

  • for - Используйте это, если вы зацикливаетесь, и вашей главной заботой является индекс массива / коллекции / списка. Более полезно использовать for, если вы, вероятнее всего, пройдете все элементы в любом случае и в определенном порядке (например, пройдя назад через отсортированный список, например).

  • foreach - используйте это, если вам просто нужно просмотреть вашу коллекцию независимо от порядка.

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

6 голосов
/ 19 сентября 2008

Почему бы не использовать конструкцию for-each? (Я давно не использовал Java, но он существует в C #, и я уверен, что в Java 1.5 тоже есть):

List<String> names = new ArrayList<String>();
names.add("a");
names.add("b");
names.add("c");

for (String name : names)
    System.out.println(name.charAt(0));
4 голосов
/ 19 сентября 2008

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

В примере "while" итератор объявлен вне цикла, поэтому он будет продолжать существовать после завершения цикла. Это может вызвать проблемы, если этот же итератор будет использован снова в какой-то более поздний момент. Например вы можете забыть инициализировать его перед использованием в другом цикле.

В примере "for" итератор объявлен внутри цикла, поэтому его область действия ограничена циклом. Если вы попытаетесь использовать его после цикла, вы получите ошибку компилятора.

2 голосов
/ 08 декабря 2011

ИМХО, цикл для менее читаем в этом сценарии, если вы посмотрите на этот код с точки зрения английского языка. Я работаю над кодом, где автор злоупотребляет для цикла, и это не красиво. Сравните следующее:

for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;

против

while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}
2 голосов
/ 19 сентября 2008

если вы собираетесь использовать итератор только один раз и выбросить его, вторая форма предпочтительна; в противном случае вы должны использовать первую форму

1 голос
/ 06 января 2014

Используя цикл for, вы можете работать с одной переменной, так как она устанавливает область видимости переменной для текущей работы только для цикла. Однако это невозможно в цикле while . Например:
int i; ибо (i = 0; in1; i ++) что-то делают ..

для (i = 0; i n2; i + = 2) сделать что-то.

Итак, после 1-го цикла я = n1-1 в конце. Но при использовании второго цикла вы можете снова установить i в 0. Однако

int i = 0;

while (я меньше лимита) {сделай что-нибудь ..; я ++; }

Следовательно, в конце я установлен на предел-1. Так что вы не можете использовать то же самое i в другом цикле while.

1 голос
/ 19 сентября 2008

Не то, чтобы это, вероятно, имело значение в этом случае, но компиляторы, виртуальные машины и процессоры обычно имеют специальные методы оптимизации, которые они используют под капотом, которые улучшат производительность циклов (и в ближайшем будущем параллельно), в общем, они не сделать это с помощью циклов while (потому что определить, как он будет работать, сложнее). Но в большинстве случаев ясность кода должна превосходить оптимизацию.

1 голос
/ 19 сентября 2008

Я бы согласился, что цикл for более понятен и более уместен при итерации.

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

0 голосов
/ 19 сентября 2008

Академия имеет тенденцию предпочитать цикл while, поскольку это упрощает рассуждения о программах. Я обычно предпочитаю структуры цикла for или foreach, поскольку они делают код более простым для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...