Какие есть способы перебора всех элементов list java

Содержание
  1. Способы перебора списка в Java
  2. Базовый для цикла (конечно, есть эквивалент while / do while )
  3. Улучшено для цикла (хорошо объяснено в этом вопросе)
  4. Итератор
  5. ListIterator
  6. Функциональная Java
  7. Iterable.forEach, Stream.forEach .
  8. ОТВЕТЫ
  9. Ответ 1
  10. Ответ 2
  11. ListIterationExample.java
  12. Ответ 3
  13. Ответ 4
  14. Ответ 5
  15. Использование Iterable forEach
  16. Использование Streams forEach и forEachOrdered
  17. Ответ 6
  18. Ответ 7
  19. Ответ 8
  20. Ответ 9
  21. Ответ 10
  22. Ответ 11
  23. Способы перебора списка в Java
  24. 1. введение
  25. 2. для петли
  26. 2.1. Базовый для цикла
  27. 2.2. Улучшено для цикла
  28. 3. Итераторы
  29. 3.1. Итератор
  30. 3.2. Листератор
  31. 4. forEach()
  32. 4.1. Повторяемость.инструкция foreach()
  33. 4.2. Поток.()
  34. 5. Заключение
  35. Способы перебора списка в Java
  36. Базовый для цикла (конечно, есть и эквивалентные while / do while циклы)
  37. Улучшено для цикла (хорошо объяснено в этом вопросе )
  38. Итератор
  39. ListIterator
  40. Функциональная Java
  41. Iterable.forEach , Stream.forEach , .
  42. Способы перебора списка в Java
  43. Базовый для цикла (конечно, есть эквивалент while / do while )
  44. Улучшено для цикла (хорошо объяснено в этом вопросе)
  45. Итератор
  46. ListIterator
  47. Функциональная Java
  48. Iterable.forEach, Stream.forEach .

Способы перебора списка в Java

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

Учитывая List list , мне известны следующие способы циклического перемещения по всем элементам:

Базовый для цикла (конечно, есть эквивалент while / do while )

Примечание. Как отметил @amarseillan, эта форма является плохим выбором для итерации над List s, потому что фактическая реализация метода get может быть не такой эффективной, как при использовании Iterator . Например, реализация LinkedList должна пересекать все элементы, предшествующие i, чтобы получить i-й элемент.

В приведенном выше примере для реализации List возможности «сохранить свое место», чтобы сделать будущие итерации более эффективными. Для ArrayList это не имеет большого значения, поскольку сложность/стоимость get — это постоянное время (O (1)), тогда как для LinkedList оно пропорционально размеру списка (O (n)).

Для получения дополнительной информации об вычислительной сложности встроенных реализаций Collections ознакомьтесь с этим вопросом.

Улучшено для цикла (хорошо объяснено в этом вопросе)

Итератор

ListIterator

Функциональная Java

Iterable.forEach, Stream.forEach .

(Метод карты из Java 8 Stream API (см. Ответ @i_am_zero).)

В классах классов Java 8, которые реализуют Iterable (например, все List s), теперь есть метод forEach , который можно использовать вместо приведенного выше оператора цикла for. (Вот еще один вопрос, который дает хорошее сравнение.)

Какие существуют другие способы, если они есть?

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

ОТВЕТЫ

Ответ 1

Три формы цикла почти идентичны. Увеличенный цикл for :

соответствует спецификации Java Language Specification, идентичной по сути явным использованием итератора с традиционным циклом for . В третьем случае вы можете изменить содержимое списка, удалив текущий элемент, а затем только в том случае, если вы сделаете это с помощью метода remove самого итератора. С помощью итерации на основе индекса вы можете каким-либо образом изменить список. Тем не менее, добавление или удаление элементов, которые появляются перед текущим индексом, рискуют иметь элементы пропускания цикла или обрабатывать один и тот же элемент несколько раз; вам необходимо правильно настроить индекс цикла при внесении таких изменений.

Во всех случаях element является ссылкой на фактический элемент списка. Ни один из методов итерации не делает копию чего-либо в списке. Изменения во внутреннем состоянии element всегда будут отображаться во внутреннем состоянии соответствующего элемента в списке.

По существу, существует только два способа перебора по списку: с помощью индекса или с помощью итератора. Улучшенный цикл for — это просто синтаксический ярлык, введенный в Java 5, чтобы избежать усталости явного определения итератора. Для обоих стилей вы можете придумать практически тривиальные варианты, используя блоки for , while или do while , но все они сводятся к одной и той же вещи (или, вернее, к двум вещам).

РЕДАКТИРОВАТЬ: Как указывает @iX3 в комментарии, вы можете использовать ListIterator для установки текущего элемента списка по мере повтора. Вам нужно будет использовать List#listIterator() вместо List#iterator() для инициализации переменной цикла (которая, очевидно, должен быть объявлен как ListIterator , а не Iterator ).

Читайте также:  Кредит европа банк способы оплаты кредита

Ответ 2

Пример каждого вида, указанного в вопросе:

ListIterationExample.java

Ответ 3

Основной цикл не рекомендуется, так как вы не знаете реализацию списка.

Если это был LinkedList, каждый вызов

будет итерировать по списку, что приведет к сложности времени N ^ 2.

Ответ 4

Итерация в стиле JDK8:

Ответ 5

В Java 8 мы имеем несколько способов итерации по классам коллекции.

Использование Iterable forEach

Коллекции, которые реализуют Iterable (например, все списки), теперь имеют метод forEach . Мы можем использовать ссылку на метод, введенную в Java 8.

Использование Streams forEach и forEachOrdered

Мы также можем перебирать список, используя Stream:

Мы должны предпочесть forEachOrdered over forEach потому что поведение forEach явно недетерминировано там, где forEachOrdered выполняет действие для каждого элемента этого потока, в порядке выполнения потока, если поток имеет определенный порядок forEachOrdered . Поэтому forEach не гарантирует, что заказ будет сохранен.

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

Ответ 6

Я не знаю, что вы считаете патологическим, но позвольте мне предоставить некоторые альтернативы, которые вы бы раньше не видели:

Или его рекурсивная версия:

Кроме того, рекурсивная версия классического for(int i=0. :

Я упоминаю их, потому что вы «несколько новы для Java», и это может быть интересно.

Ответ 7

Вы можете использовать forEach, начиная с Java 8:

Ответ 8

Для обратного поиска вы должны использовать следующее:

Если вы хотите знать позицию, используйте iterator.previousIndex(). Это также помогает написать внутренний цикл, который сравнивает две позиции в списке (итераторы не равны).

Ответ 9

В java 8 вы можете использовать List.forEach() с lambda expression для перебора списка.

Ответ 10

Правильно, перечислены многие альтернативы. Самый простой и чистый — это просто использовать расширенный оператор for как показано ниже. Expression имеет некоторый тип, который является итерируемым.

Например, чтобы перебирать, List ids, мы можем просто так,

Ответ 11

Вы всегда можете отключить первый и третий примеры с циклом while и немного больше кода. Это дает вам преимущество в том, что вы можете использовать do-while:

Источник

Способы перебора списка в Java

Просмотрите различные способы перебора списка в Java

Автор: baeldung
Дата записи

1. введение

Перебор элементов списка – одна из наиболее распространенных задач в программе.

В этом уроке мы рассмотрим различные способы сделать это на Java. Мы сосредоточимся на повторении списка по порядку, хотя идти в обратном порядке тоже просто.

2. для петли

Во-первых, давайте рассмотрим некоторые варианты цикла.

Давайте начнем с определения списка стран для наших примеров:

2.1. Базовый для цикла

Наиболее распространенным оператором управления потоком для итерации является базовый цикл for .

Цикл for определяет три типа операторов, разделенных точками с запятой. Первый оператор-это оператор инициализации. Второй определяет условие завершения. Последнее утверждение-это предложение update.

Здесь мы просто используем целочисленную переменную в качестве индекса:

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

Условие завершения-это выражение, которое после вычисления возвращает логическое значение, как только это выражение принимает значение false цикл завершается.

Предложение update используется для изменения текущего состояния переменной индекса, увеличивая или уменьшая его до момента завершения.

2.2. Улучшено для цикла

Расширенный цикл for – это простая структура, которая позволяет нам посещать каждый элемент списка. Он похож на базовый цикл for, но более удобочитаем и компактен. Следовательно, это одна из наиболее часто используемых форм для обхода списка.

Обратите внимание, что расширенный цикл for проще, чем базовый цикл for :

3. Итераторы

Итератор-это шаблон проектирования, который предлагает нам стандартный интерфейс для обхода структуры данных, не беспокоясь о внутреннем представлении.

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

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

3.1. Итератор

В Java шаблон Iterator отражается в файле java.util.Итератор класс. Он широко используется в Java Коллекциях . В Итераторе есть два ключевых метода: hasNext() и next() методы.

Читайте также:  Народные способы улучшить память

Здесь мы демонстрируем использование обоих:

Метод hasNext () проверяет, остались ли какие-либо элементы в списке .

Метод next () возвращает следующий элемент в итерации .

3.2. Листератор

/| ListIterator позволяет нам просматривать список элементов в прямом или обратном порядке.

Прокрутка списка с помощью ListIterator вперед следует механизму, аналогичному механизму, используемому Итератором . Таким образом, мы можем переместить итератор вперед с помощью метода next() и найти конец списка с помощью метода hasNext () .

Как мы видим, ListIterator очень похож на Итератор , который мы использовали ранее:

4. forEach()

4.1. Повторяемость.инструкция foreach()

Начиная с Java 8, мы можем использовать метод forEach () для перебора элементов списка . Этот метод определен в интерфейсе Iterable и может принимать лямбда-выражения в качестве параметра.

Синтаксис довольно прост:

До функции forEach все итераторы в Java были активны, то есть они включали цикл for или while, который проходил сбор данных до тех пор, пока не было выполнено определенное условие.

С введением forEach в качестве функции в интерфейсе Iterable во все классы, реализующие Iterable , добавлена функция forEach .

4.2. Поток.()

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

Здесь мы демонстрируем типичное использование потоков:

5. Заключение

В этой статье мы показали различные способы перебора элементов списка с помощью Java API. Среди них мы упомянули цикл for , расширенный цикл for , итератор , ЛистИтератор и метод forEach () (включен в Java 8).

Кроме того, мы также показали, как использовать метод forEach() с потоками .

Наконец, весь код, используемый в этой статье, доступен в нашем репо Github .

Источник

Способы перебора списка в Java

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

Для данного List list объекта я знаю следующие способы прохождения всех элементов:

Базовый для цикла (конечно, есть и эквивалентные while / do while циклы)

Примечание: как указал @amarseillan, эта форма является плохим выбором для итерации по List s, поскольку фактическая реализация get метода может быть не такой эффективной, как при использовании Iterator . Например, LinkedList реализации должны пройти все элементы, предшествующие i, чтобы получить i-й элемент.

В приведенном выше примере List реализация не может «сохранить свое место», чтобы сделать будущие итерации более эффективными. Для a ArrayList это на самом деле не имеет значения, потому что сложность / стоимость get является постоянным временем (O (1)), тогда как для a LinkedList это пропорционально размеру списка (O (n)).

Для получения дополнительной информации о вычислительной сложности встроенных Collections реализаций, проверьте этот вопрос .

Улучшено для цикла (хорошо объяснено в этом вопросе )

Итератор

ListIterator

Функциональная Java

Iterable.forEach , Stream.forEach , .

(Метод карты из Stream API Java 8 (см. Ответ @ i_am_zero).)

В Java 8 классы коллекций, которые реализуют Iterable (например, все List ), теперь имеют forEach метод, который можно использовать вместо оператора цикла for, показанного выше. (Вот еще один вопрос, который дает хорошее сравнение.)

Какие еще есть способы, если таковые имеются?

(Кстати, мой интерес совсем не связан с желанием оптимизировать производительность ; я просто хочу знать, какие формы доступны мне как разработчику.)

Три формы зацикливания почти идентичны. Усовершенствованный for цикл:

является, согласно спецификации языка Java , идентичного по эффекту явного использования итератора с традиционным for контуром. В третьем случае вы можете изменить содержимое списка, только удалив текущий элемент, и только тогда, если вы сделаете это через remove метод самого итератора. С итерацией на основе индекса вы можете изменять список любым способом. Однако добавление или удаление элементов, предшествующих текущему индексу, может привести к пропуску элементов цикла или обработке одного и того же элемента несколько раз; вам нужно правильно настроить индекс цикла при внесении таких изменений.

Во всех случаях element это ссылка на фактический элемент списка. Ни один из методов итерации не создает копию чего-либо в списке. Изменения во внутреннем состоянии element всегда будут видны во внутреннем состоянии соответствующего элемента в списке.

Читайте также:  Способов жить по средствам

По сути, существует только два способа перебора списка: с помощью индекса или с помощью итератора. Усовершенствованный цикл for — это всего лишь синтаксический ярлык, введенный в Java 5, чтобы избежать скуки явного определения итератора. Для обоих стилей вы можете придумать по существу тривиальные варианты, используя for , while или do while блоки, но все они сводятся к одному и тому же (или, скорее, двум вещам).

РЕДАКТИРОВАТЬ: Как @ iX3 указывает в комментарии, вы можете использовать a, ListIterator чтобы установить текущий элемент списка во время итерации. Вы должны будете использовать List#listIterator() вместо List#iterator() инициализации переменную цикла (которая, очевидно, должна быть объявлена ListIterator вместо а Iterator ).

Источник

Способы перебора списка в Java

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

Учитывая List list , мне известны следующие способы циклического перемещения по всем элементам:

Базовый для цикла (конечно, есть эквивалент while / do while )

Примечание. Как отметил @amarseillan, эта форма является плохим выбором для итерации над List s, потому что фактическая реализация метода get может быть не такой эффективной, как при использовании Iterator . Например, реализация LinkedList должна пересекать все элементы, предшествующие i, чтобы получить i-й элемент.

В приведенном выше примере для реализации List возможности «сохранить свое место», чтобы сделать будущие итерации более эффективными. Для ArrayList это не имеет большого значения, поскольку сложность/стоимость get — это постоянное время (O (1)), тогда как для LinkedList оно пропорционально размеру списка (O (n)).

Для получения дополнительной информации об вычислительной сложности встроенных реализаций Collections ознакомьтесь с этим вопросом.

Улучшено для цикла (хорошо объяснено в этом вопросе)

Итератор

ListIterator

Функциональная Java

Iterable.forEach, Stream.forEach .

(Метод карты из Java 8 Stream API (см. Ответ @i_am_zero).)

В классах классов Java 8, которые реализуют Iterable (например, все List s), теперь есть метод forEach , который можно использовать вместо приведенного выше оператора цикла for. (Вот еще один вопрос, который дает хорошее сравнение.)

Какие существуют другие способы, если они есть?

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

В java 8 вы можете использовать List.forEach() с lambda expression для перебора списка.

Три формы цикла почти идентичны. Увеличенный цикл for :

соответствует спецификации Java Language Specification, идентичной по сути явным использованием итератора с традиционным циклом for . В третьем случае вы можете изменить содержимое списка, удалив текущий элемент, а затем только в том случае, если вы сделаете это с помощью метода remove самого итератора. С помощью итерации на основе индекса вы можете каким-либо образом изменить список. Тем не менее, добавление или удаление элементов, которые появляются перед текущим индексом, рискуют иметь элементы пропускания цикла или обрабатывать один и тот же элемент несколько раз; вам необходимо правильно настроить индекс цикла при внесении таких изменений.

Во всех случаях element является ссылкой на фактический элемент списка. Ни один из методов итерации не делает копию чего-либо в списке. Изменения во внутреннем состоянии element всегда будут отображаться во внутреннем состоянии соответствующего элемента в списке.

По существу, существует только два способа перебора по списку: с помощью индекса или с помощью итератора. Улучшенный цикл for — это просто синтаксический ярлык, введенный в Java 5, чтобы избежать усталости явного определения итератора. Для обоих стилей вы можете придумать практически тривиальные варианты, используя блоки for , while или do while , но все они сводятся к одной и той же вещи (или, вернее, к двум вещам).

РЕДАКТИРОВАТЬ: Как указывает @iX3 в комментарии, вы можете использовать ListIterator для установки текущего элемента списка по мере повтора. Вам нужно будет использовать List#listIterator() вместо List#iterator() для инициализации переменной цикла (которая, очевидно, должен быть объявлен как ListIterator , а не Iterator ).

Источник

Оцените статью
Разные способы