какие есть способы перебора всех элементов list
Способы перебора списка в Java
Способы перебора списка в Java
1. Вступление
В этом руководстве мы рассмотрим различные способы сделать это на Java. Мы сосредоточимся на итерации по списку по порядку, хотя перейти наin reverse тоже просто.
2. for Цикл
Во-первых, давайте рассмотрим несколько вариантовfor loop.
Давайте начнем с определения списка стран для наших примеров:
2.1. Базовый циклfor
Наиболее распространенным оператором управления потоком для итераций является основной циклfor.
Здесь мы просто используем целочисленную переменную в качестве индекса:
При инициализации мы должны объявить целочисленную переменную, чтобы указать начальную точку. Эта переменная обычно действует как индекс списка.
Предложение обновления используется для изменения текущего состояния индексной переменной, увеличения или уменьшения его до момента завершения.
2.2. Улучшенный циклfor
Обратите внимание, что расширенный циклfor проще, чем базовый циклfor:
3. итераторы
Этот способ обхода структур данных предлагает много преимуществ, среди которых мы можем подчеркнуть, что наш код не зависит от реализации.
Следовательно, структура может быть двоичным деревом или двусвязным списком, посколькуIterator абстрагирует нас от способа выполнения обхода. Таким образом, мы можем легко заменить структуры данных в нашем коде без неприятных проблем.
3.1. Iteratorс
В Java шаблонIterator отражается в классеjava.util.Iterator. Он широко используется в JavaCollections. ВIterator есть два ключевых метода:hasNext() иnext().
Здесь мы демонстрируем использование обоих:
МетодhasNext()checks if there are any elements remaining in the list.
Методnext()returns the next element in the iteration.
3.2. ListIteratorс
ListIterator позволяет нам перемещаться по списку элементов в прямом или обратном порядке.
Прокрутка списка с помощьюListIterator вперед выполняется по механизму, аналогичному используемомуIterator. Таким образом, мы можем переместить итератор вперед с помощью методаnext(), а мы можем найти конец списка с помощью методаhasNext().
Как мы видим,ListIterator очень похож наIterator, который мы использовали ранее:
4. forEach()с
4.1. Iterable.forEach()с
Since Java 8, we can use the forEach() method to iterate over the elements of a list. Этот метод определен в интерфейсеIterable и может принимать лямбда-выражения в качестве параметра.
Синтаксис довольно прост:
До функцииforEach все итераторы в Java были активными, то есть они включали цикл for или while, который просматривал сбор данных до тех пор, пока не было выполнено определенное условие.
С введениемforEach как функции в интерфейсеIterable, все классы, реализующиеIterable, имеют добавленную функциюforEach.
4.2. Stream.forEach()с
Мы также можем преобразовать коллекцию значений в поток и получить доступ к таким операциям, какforEach(),map(), илиfilter().
Здесь мы демонстрируем типичное использование для потоков:
5. Заключение
Кроме того, мы также показали, как использовать методforEach() сStreams.
Наконец, весь код, использованный в этой статье, доступен в нашемGithub repo.
Способы перебора списка в Java
Будучи немного новым для языка Java, я пытаюсь ознакомиться со всеми способами (или, по крайней мере, с непатологическими), которые можно перебрать в списке (или, возможно, с другими коллекциями), а также с преимуществами или недостатками каждого из них.
Для данного List list объекта я знаю следующие способы прохождения всех элементов:
Базовый для цикла (конечно, есть и эквивалентные while / do while циклы)
В приведенном выше примере List реализация не может «сохранить свое место», чтобы сделать будущие итерации более эффективными. Для a ArrayList это на самом деле не имеет значения, потому что сложность / стоимость get является постоянным временем (O (1)), тогда как для a LinkedList это пропорционально размеру списка (O (n)).
Улучшено для цикла (хорошо объяснено в этом вопросе )
Итератор
ListIterator
Функциональная Java
(Метод карты из Stream API Java 8 (см. Ответ @ i_am_zero).)
В Java 8 классы коллекций, которые реализуют Iterable (например, все List ), теперь имеют forEach метод, который можно использовать вместо оператора цикла for, показанного выше. (Вот еще один вопрос, который дает хорошее сравнение.)
Какие еще есть способы, если таковые имеются?
(Кстати, мой интерес совсем не связан с желанием оптимизировать производительность ; я просто хочу знать, какие формы доступны мне как разработчику.)
Три формы зацикливания почти идентичны. Усовершенствованный for цикл:
Во всех случаях element это ссылка на фактический элемент списка. Ни один из методов итерации не создает копию чего-либо в списке. Изменения во внутреннем состоянии element всегда будут видны во внутреннем состоянии соответствующего элемента в списке.
РЕДАКТИРОВАТЬ: Как @ iX3 указывает в комментарии, вы можете использовать a, ListIterator чтобы установить текущий элемент списка во время итерации. Вы должны будете использовать List#listIterator() вместо List#iterator() инициализации переменную цикла (которая, очевидно, должна быть объявлена ListIterator вместо а Iterator ).
Способы перебора списка в Java
Будучи несколько новым для языка Java, я пытаюсь ознакомиться со всеми способами (или, по крайней мере, непатологическими), которые можно перебирать через список (или, возможно, другие коллекции), а также преимущества или недостатки каждого из них.
Базовый для цикла (конечно, есть эквивалент while / do while )
Для получения дополнительной информации об вычислительной сложности встроенных реализаций Collections ознакомьтесь с этим вопросом.
Улучшено для цикла (хорошо объяснено в этом вопросе)
Итератор
ListIterator
Функциональная Java
(Метод карты из Java 8 Stream API (см. Ответ @i_am_zero).)
Какие существуют другие способы, если они есть?
(Кстати, мой интерес отнюдь не сводится к желанию оптимизировать производительность, я просто хочу знать, какие формы доступны мне как разработчику.)
ОТВЕТЫ
Ответ 1
Три формы цикла почти идентичны. Увеличенный цикл for :
Во всех случаях element является ссылкой на фактический элемент списка. Ни один из методов итерации не делает копию чего-либо в списке. Изменения во внутреннем состоянии element всегда будут отображаться во внутреннем состоянии соответствующего элемента в списке.
Ответ 2
Пример каждого вида, указанного в вопросе:
ListIterationExample.java
Ответ 3
Основной цикл не рекомендуется, так как вы не знаете реализацию списка.
Если это был LinkedList, каждый вызов
будет итерировать по списку, что приведет к сложности времени N ^ 2.
Ответ 4
Итерация в стиле JDK8:
Ответ 5
В Java 8 мы имеем несколько способов итерации по классам коллекции.
Использование Iterable forEach
Использование Streams forEach и forEachOrdered
Мы также можем перебирать список, используя Stream:
Преимущество потоков состоит в том, что мы можем также использовать параллельные потоки, где это необходимо. Если целью является только печать элементов независимо от порядка, то мы можем использовать параллельный поток как:
Ответ 6
Я не знаю, что вы считаете патологическим, но позвольте мне предоставить некоторые альтернативы, которые вы бы раньше не видели:
Или его рекурсивная версия:
Кроме того, рекурсивная версия классического for(int i=0. :
Я упоминаю их, потому что вы «несколько новы для Java», и это может быть интересно.
Ответ 7
Вы можете использовать forEach, начиная с Java 8:
Ответ 8
Для обратного поиска вы должны использовать следующее:
Если вы хотите знать позицию, используйте iterator.previousIndex(). Это также помогает написать внутренний цикл, который сравнивает две позиции в списке (итераторы не равны).
Ответ 9
В java 8 вы можете использовать List.forEach() с lambda expression для перебора списка.
Ответ 10
Например, чтобы перебирать, List ids, мы можем просто так,
Ответ 11
Вы всегда можете отключить первый и третий примеры с циклом while и немного больше кода. Это дает вам преимущество в том, что вы можете использовать do-while:
Собеседование по Java — коллекции (Collections) (вопросы и ответы)
Список вопросов и ответов по теме “Коллекции в Java”.
К списку вопросов по всем темам
Вопросы
1. Дайте определение понятию “коллекция”.
2. Назовите преимущества использования коллекций.
3. Какие данные могут хранить коллекции?
4. Какова иерархия коллекций?
5. Что вы знаете о коллекциях типа List?
6. Что вы знаете о коллекциях типа Set?
7. Что вы знаете о коллекциях типа Queue?
8. Что вы знаете о коллекциях типа Map, в чем их принципиальное отличие?
9. Назовите основные реализации List, Set, Map.
10. Какие реализации SortedSet вы знаете и в чем их особенность?
11. В чем отличия/сходства List и Set?
12. Что разного/общего у классов ArrayList и LinkedList, когда лучше использовать ArrayList, а когда LinkedList?
13. В каких случаях разумно использовать массив, а не ArrayList?
14. Чем отличается ArrayList от Vector?
15. Что вы знаете о реализации классов HashSet и TreeSet?
16. Чем отличаются HashMap и TreeMap? Как они устроены и работают? Что со временем доступа к объектам, какие зависимости?
17. Что такое Hashtable, чем она отличается от HashMap? На сегодняшний день она deprecated, как все-таки использовать нужную функциональность?
18. Что будет, если в Map положить два значения с одинаковым ключом?
19. Как задается порядок следования объектов в коллекции, как отсортировать коллекцию?
20. Дайте определение понятию “итератор”.
21. Какую функциональность представляет класс Collections?
22. Как получить не модифицируемую коллекцию?
23. Какие коллекции синхронизированы?
24. Как получить синхронизированную коллекцию из не синхронизированной?
25. Как получить коллекцию только для чтения?
26. Почему Map не наследуется от Collection?
27. В чем разница между Iterator и Enumeration?
28. Как реализован цикл foreach?
29. Почему нет метода iterator.add() чтобы добавить элементы в коллекцию?
30. Почему в классе iterator нет метода для получения следующего элемента без передвижения курсора?
31. В чем разница между Iterator и ListIterator?
32. Какие есть способы перебора всех элементов List?
33. В чем разница между fail-safe и fail-fast свойствами?
34. Что делать, чтобы не возникло исключение ConcurrentModificationException?
35. Что такое стек и очередь, расскажите в чем их отличия?
36. В чем разница между интерфейсами Comparable и Comparator?
37. Почему коллекции не наследуют интерфейсы Cloneable и Serializable?
Ответы
Тема коллекций невероятно обширная и для того, чтобы ответить на каждый вопрос глубоко нужна отдельная статья почти под каждый вопрос. При проработке этого раздела рекомендую прочитать дополнительный материал, указанный в ответах.
1. Дайте определение понятию “коллекция”.
Коллекциями/контейнерами в Java принято называть классы, основная цель которых – хранить набор других элементов.
2. Назовите преимущества использования коллекций.
Массивы обладают значительными недостатками. Одним из них является конечный размер массива, как следствие, необходимость следить за размером массива. Другим — индексная адресация, что не всегда удобно, т.к. ограничивает возможности добавления и удаления объектов. Чтобы избавиться от этих недостатков уже несколько десятилетий программисты используют рекурсивные типы данных, такие как списки и деревья. Стандартный набор коллекций Java служит для избавления программиста от необходимости самостоятельно реализовывать эти типы данных и снабжает его дополнительными возможностями.
3. Какие данные могут хранить коллекции?
Коллекции могут хранить любые ссылочные типы данных.
4. Какова иерархия коллекций?
Здесь следует обратить внимание, что interface Map не входит в иерархию interface Collection.
С Java 1.6 классы TreeSet и TreeMap имплементируют интерфейсы NavigableSet и NavigableMap, которые расширяют интерфейсы SortedSet и SortedMap соответственно (SortedSet и SortedMap расширяют Set и Map).
Подробная статья про коллекции с описанием основных методов: http://www.quizful.net/post/Java-Collections
5. Что вы знаете о коллекциях типа List?
List — это упорядоченный список. Объекты хранятся в порядке их добавления в список. Доступ к элементам списка осуществляется по индексу.
6. Что вы знаете о коллекциях типа Set?
7. Что вы знаете о коллекциях типа Queue?
Queue — коллекция, предназначенная для хранения элементов в порядке, нужном для их обработки. В дополнение к базовым операциям интерфейса Collection, очередь предоставляет дополнительные операции вставки, получения и контроля.
Очереди обычно, но не обязательно, упорядочивают элементы в FIFO (first-in-first-out, «первым вошел — первым вышел») порядке.
Методы element() и peek() возвращают (но не удаляют) верхушку очереди.
java.util.Queue реализует FIFO–буфер. Позволяет добавлять и получать объекты. При этом объекты могут быть получены в том порядке, в котором они были добавлены.
Подробнее http://www.seostella.com/ru/article/2012/08/09/kollekcii-collections-v-java-queue.html
8. Что вы знаете о коллекциях типа Map, в чем их принципиальное отличие?
Интерфейс java.util.Map используется для отображения каждого элемента из одного множества объектов (ключей) на другое (значений). При этом, каждому элементу из множества ключей ставится в соответствие множество значений. В то же время одному элементу из множества значений может соответствовать 1, 2 и более элементов из множества ключей. Интерфейс java.util.Map описывает функциональность ассоциативных массивов.
http://developer.alexanderklimov.ru/android/java/map.php
9. Назовите основные реализации List, Set, Map.
Интерфейс | Класс/Реализация | Описание |
---|---|---|
List | ArrayList | Список |
LinkedList | Список | |
Vector | Вектор | |
Stack | Стек | |
Set | HashSet | Множество |
TreeSet | Множество | |
SortedSet (расширяющий интерфейс) | Отсортированное множество | |
Map | HashMap | Карта/Словарь |
TreeMap | Карта/Словарь | |
SortedMap (расширяющий интерфейс) | Отсортированный словарь | |
Hashtable | Хеш-таблица |
10. Какие реализации SortedSet вы знаете и в чем их особенность?
Реализации: java.util.TreeSet — коллекция, которая хранит свои элементы в виде упорядоченного по значениям дерева. TreeSet инкапсулирует в себе TreeMap, который в свою очередь использует сбалансированное бинарное красно-черное дерево для хранения элементов. TreeSet хорош тем, что для операций add, remove и contains потребуется гарантированное время log(n).
11. В чем отличия/сходства List и Set?
12. Что разного/общего у классов ArrayList и LinkedList, когда лучше использовать ArrayList, а когда LinkedList?
Описание | Операция | ArrayList | LinkedList |
---|---|---|---|
Взятие элемента | get | Быстро | Медленно |
Присваивание элемента | set | Быстро | Медленно |
Добавление элемента | add | Быстро | Быстро |
Вставка элемента | add(i, value) | Медленно | Быстро |
Удаление элемента | remove | Медленно | Быстро |
Если необходимо вставлять (или удалять) в середину коллекции много элементов, то лучше использовать LinkedList. Во всех остальных случаях – ArrayList.
LinkedList требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка, тогда как в ArrayList элементы просто идут по порядку
Из лекции javarush.ru
Структуры данных в картинках. LinkedList: http://habrahabr.ru/post/127864/
13. В каких случаях разумно использовать массив, а не ArrayList?
Если коротко, то Oracle пишет — используйте ArrayList вместо массивов. Если ответить на этот вопрос нужно по-другому, то можно сказать следующее: массивы могут быть быстрее и кушать меньше памяти. Списки теряют в производительности из-за возможности автоматического увеличения размера и сопутствующих проверок. Плюс к этому, что размер списка увеличивается не на 1, а на большее кол-во элементов (+15)*. Так же доступ к [10] в массиве может быть быстрее чем вызов get(10) у списка.
*Читатель прислал комментарий «У ArrayList увеличение происходит в 1.5 раза. int newCapacity = oldCapacity + (oldCapacity >> 1);».
Структуры данных в картинках. ArrayList: http://habrahabr.ru/post/128269/
Еще о ArrayList на сайте http://developer.alexanderklimov.ru/android/java/arraylist.php
14. Чем отличается ArrayList от Vector?
Vector deprecated. У Vector некоторые методы синхронизированы и поэтому они медленные. В любом случае Vector не рекомендуется использовать вообще.
15. Что вы знаете о реализации классов HashSet и TreeSet?
HashSet реализован на основе хеш-таблицы, а TreeSet — на основе бинарного дерева.
Подробнее о Set, HashSet, LinkedHashSet, TreeSet: http://developer.alexanderklimov.ru/android/java/set.php
Годный ответ на StackOverflow http://stackoverflow.com/questions/1463284/hashset-vs-treeset
16. Чем отличаются HashMap и TreeMap? Как они устроены и работают? Что со временем доступа к объектам, какие зависимости?
В целом ответ про HashSet и TreeSet подходит и к этому вопросу.
TreeMap реализован на красно-черном дереве, время добавления/поиска/удаления элемента — O(log N), где N — число элементов в TreeMap на данный момент.
У HashMap время доступа к отдельному элементу — O(1) при условии, что хэш-функция ( Object.hashCode() ) определена нормально (что является правдой в случае Integer ).
Структуры данных в картинках. HashMap: http://habrahabr.ru/post/128017/
17. Что такое Hashtable, чем она отличается от HashMap? На сегодняшний день она deprecated, как все-таки использовать нужную функциональность?
http://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable
18. Что будет, если в Map положить два значения с одинаковым ключом?
Последнее значение перезапишет предыдущее.
19. Как задается порядок следования объектов в коллекции, как отсортировать коллекцию?
В этом классе четыре конструктора:
ТгееМар() — создает пустой объект с естественным порядком элементов;
TreeМар(Comparator с) — создает пустой объект, в котором порядок задается объектом сравнения с;
ТгееМар(Map f) — создает объект, содержащий все элементы отображения f, с естественным порядком его элементов;
ТгееМар(SortedMap sf) — создает объект, содержащий все элементы отображения sf, в том же порядке.
Интерфейс Comparator описывает два метода сравнения:
Для каждой коллекции можно реализовать эти два метода, задав конкретный способ сравнения элементов, и определить объект класса SortedMap вторым конструктором. Элементы коллекции будут автоматически отсортированы в заданном порядке.
Способы перебора списка в Java
Просмотрите различные способы перебора списка в Java
1. введение
Перебор элементов списка – одна из наиболее распространенных задач в программе.
В этом уроке мы рассмотрим различные способы сделать это на Java. Мы сосредоточимся на повторении списка по порядку, хотя идти в обратном порядке тоже просто.
2. для петли
Во-первых, давайте рассмотрим некоторые варианты цикла.
Давайте начнем с определения списка стран для наших примеров:
2.1. Базовый для цикла
Цикл for определяет три типа операторов, разделенных точками с запятой. Первый оператор-это оператор инициализации. Второй определяет условие завершения. Последнее утверждение-это предложение update.
Здесь мы просто используем целочисленную переменную в качестве индекса:
При инициализации мы должны объявить целочисленную переменную, чтобы указать начальную точку. Эта переменная обычно действует как индекс списка.
Условие завершения-это выражение, которое после вычисления возвращает логическое значение, как только это выражение принимает значение false цикл завершается.
Предложение update используется для изменения текущего состояния переменной индекса, увеличивая или уменьшая его до момента завершения.
2.2. Улучшено для цикла
Расширенный цикл for – это простая структура, которая позволяет нам посещать каждый элемент списка. Он похож на базовый цикл for, но более удобочитаем и компактен. Следовательно, это одна из наиболее часто используемых форм для обхода списка.
Обратите внимание, что расширенный цикл for проще, чем базовый цикл for :
3. Итераторы
Итератор-это шаблон проектирования, который предлагает нам стандартный интерфейс для обхода структуры данных, не беспокоясь о внутреннем представлении.
Этот способ обхода структур данных предлагает множество преимуществ, среди которых мы можем подчеркнуть, что наш код не зависит от реализации.
Таким образом, структура может быть двоичным деревом или двусвязным списком, поскольку итератор абстрагирует нас от способа выполнения обхода. Таким образом, мы можем легко заменить структуры данных в нашем коде без неприятных проблем.
3.1. Итератор
Здесь мы демонстрируем использование обоих:
3.2. Листератор
/| ListIterator позволяет нам просматривать список элементов в прямом или обратном порядке.
4. forEach()
4.1. Повторяемость.инструкция foreach()
Синтаксис довольно прост:
До функции forEach все итераторы в Java были активны, то есть они включали цикл for или while, который проходил сбор данных до тех пор, пока не было выполнено определенное условие.
4.2. Поток.()
Здесь мы демонстрируем типичное использование потоков: