Итерация с циклом цикла или while?

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

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

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

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

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

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

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

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

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

 List names = new ArrayList(); names.add("a"); names.add("b"); names.add("c"); for (String name : names) System.out.println(name.charAt(0)); 

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

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

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

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

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

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

против

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

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

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

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

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

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

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

int i = 0;

while (i меньше предела) {сделайте что-то ..; я ++; }

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

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

Я согласен, что цикл for должен использоваться по возможности, но иногда есть более сложная логика, которая управляет iteratorом в теле цикла. В этом случае вам нужно идти вместе.

Я был для петли для ясности. Хотя я использую цикл while, когда сталкиваюсь с каким-то неопределенным условием.

Оба они в порядке, но помните, что иногда доступ к Iterator напрямую полезен (например, если вы удаляете элементы, которые соответствуют определенному условию), вы получите исключение ConcurrentModificationException, если вы делаете collection.remove (o) внутри a for (T o: сбор).

Я предпочитаю писать синтаксис for (blah: blah) [foreach] почти все время, потому что мне кажется более понятным для меня. Концепция iteratorов вообще не имеет параллелей вне программирования

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

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

В каждой строке происходит меньше операций с циклом while (), что делает код более легким для кого-то нового для кода, чтобы понять, что происходит.

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

  • Почему Java-streamи отключены?
  • Простой запрос на hibernate, возвращающийся очень медленно
  • Тип Keystore: какой из них использовать?
  • Сжатие строк Java
  • Когда меняется пул?
  • Весна, Спящий режим, Боб ленивая загрузка
  • Что такое встроенные методы в Java и где они должны использоваться?
  • Есть ли способ снизить кучу Java, когда он не используется?
  • Как избежать необходимости указывать местоположение WSDL в CXF или JAX-WS, сгенерированном веб-сервисом?
  • Обнаружение ввода нажмите в JTextField
  • Spring настроить формат @ResponseBody JSON
  • Давайте будем гением компьютера.