Что такое итератор java
Перейти к содержимому

Что такое итератор java

  • автор:

Интерфейс Iterator

В этом разделе рассмотрим что такое итератор Java языка.

Перебор содержимого коллекции может быть осуществлен двумя способами: c помощью цикла for each и с помощью итератора.

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

Чтобы получить объект итератора, вызовите метод Iterator iterator() .

Методы интерфейса Iterator:

  • boolean hasNext() — возвращает true , если есть еще элементы. В противном случае возвращает false .
  • E next() — возвращает следующий элемент. Если следующий элемент коллекции отсутствует, то метод next() генерирует исключение NoSuchElementException .
  • void remove() — удаляет текущий элемент. Возбуждает исключение IllegalStateException , если предпринимается попытка вызвать remove() , которой не предшествовал вызов next() .

Пример использования интерфейса Iterator

import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorDemo < public static void main(String[] args) < ListarrayList = new ArrayList<>(); arrayList.add("C"); arrayList.add("A"); arrayList.add("E"); arrayList.add("B"); arrayList.add("D"); arrayList.add("F"); Iterator iterator = arrayList.iterator(); while (iterator.hasNext()) < String element = iterator.next(); System.out.print(element + " "); >> >

Все классы в каркасе коллекций усовершенствованы таким образом, чтобы реализовывать интерфейс Iterable . Это означает, что содержимое коллекции можно перебрать, организовав цикл for в стиле for each. Конструкция for each скрывает итератор, поэтому нельзя вызвать метод remove() .

  • Интерфейс Collection
  • Структуры данных
  • Интерфейс List и класс ArrayList
  • Интерфейс Set и классы HashSet, LinkedHashSet
  • Интерфейс SortedSet и класс TreeSet
  • Интерфейсы Comparable и Comparator
  • Интерфейс NavigableSet
  • Интерфейс Queue и классы
  • Интерфейс ListIterator
  • Отображения Map
  • Класс Collections
  • Backed Collections
  • Legacy Classes
  • Задания

31.19. Java – Iterator и ListIterator

Часто вам нужно циклически перемещаться по элементам в коллекции. Например, вы можете отобразить каждый элемент. Самый простой способ сделать это — использовать итератор, который является объектом, который реализует интерфейс Iterator или ListIterator.

Итератор позволяет вам перемещаться по коллекции, получать или удалять элементы. ListIterator расширяет Итератор, чтобы обеспечить двунаправленный обход списка и модификацию элементов.

Прежде чем вы сможете получить доступ к коллекции через итератор, вы должны ее получить. Каждый из классов коллекции предоставляет метод iterator (), который возвращает итератор в начало коллекции. Используя этот объект итератора, вы можете получить доступ к каждому элементу в коллекции, по одному элементу за раз.

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

  • Получите итератор в начале коллекции, вызвав метод iterator() коллекции.
  • Настройте цикл, который вызывает hasNext(). Повторяйте цикл, пока hasNext() возвращает true.
  • Внутри цикла получите каждый элемент, вызывая next().

Для коллекций, которые реализуют List, вы также можете получить итератор, вызвав ListIterator.

Методы, объявленные Iterator

Метод и описание
1 boolean hasNext( )
Возвращает true, если есть ещё элементы. В противном случае возвращает false.
2 Object next( )
Возвращает следующий элемент. Вызывает исключение NoSuchElementException, если не существует следующего элемента.
3 void remove( )
Удаляет текущий элемент. Выбрасывает IllegalStateException, если делается попытка вызвать remove(), которому не предшествует вызов next().

Методы, объявленные ListIterator

Метод и описание
1 void add(Object obj)
Вставляет obj в список перед элементом, который будет возвращен следующим вызовом next().
2 boolean hasNext( )
Возвращает true, если есть следующий элемент. В противном случае возвращает false.
3 boolean hasPrevious( )
Возвращает true, если есть предыдущий элемент. В противном случае возвращает false.
4 Object next( )
Возвращает следующий элемент. A NoSuchElementException вызывается, если не существует следующего элемента.
5 int nextIndex( )
Возвращает индекс следующего элемента. Если нет следующего элемента, возвращается размер списка.
6 Object previous( )
Возвращает предыдущий элемент. A NoSuchElementException вызывается, если не существует следующего элемента.
7 int previousIndex( )
Возвращает индекс предыдущего элемента. Если нет предыдущего элемента, возвращается -1.
8 void remove( )
Удаляет текущий элемент из списка. Вызывается IllegalStateException, если вызывается функция remove() вызвана перед next() или previous().
9 void set(Object obj)
Назначает obj текущему элементу. Это последний элемент, возвращаемый вызовом либо next(), либо previous().

Пример

Вот пример, демонстрирующий как Iterator, так и ListIterator в Java. Он использует объект ArrayList, но общие принципы применимы к любому типу коллекции.

Конечно, ListIterator доступен только для тех коллекций, которые реализуют интерфейс List.

import java.util.*; public class IteratorDemo < public static void main(String args[]) < // Создаём список массивов ArrayList al = new ArrayList(); // Добавляем элементы к списку массивов al.add("C"); al.add("A"); al.add("E"); al.add("B"); al.add("D"); al.add("F"); // Используем итератор, для отображения элементов al System.out.print("Начальное содержание al: "); Iterator itr = al.iterator(); while(itr.hasNext()) < Object element = itr.next(); System.out.print(element + " "); >System.out.println(); // Изменяем повторяемые объекты ListIterator litr = al.listIterator(); while(litr.hasNext()) < Object element = litr.next(); litr.set(element + "+"); >System.out.print("Изменённое содержание al: "); itr = al.iterator(); while(itr.hasNext()) < Object element = itr.next(); System.out.print(element + " "); >System.out.println(); // Теперь, отобразим список задом наперёд System.out.print("Изменённый список задом наперёд: "); while(litr.hasPrevious()) < Object element = litr.previous(); System.out.print(element + " "); >System.out.println(); > > 

Получим следующий результат:

Начальное содержание al: C A E B D F Изменённое содержание al: C+ A+ E+ B+ D+ F+ Изменённый список задом наперёд: F+ D+ B+ E+ A+ C+ 

Оглавление

  • 1. Java – Самоучитель для начинающих
  • 2. Java – Обзор языка
  • 3. Java – Установка и настройка
  • 4. Java – Синтаксис
  • 5. Java – Классы и объекты
  • 6. Java – Конструкторы
  • 7. Java – Типы данных и литералы
  • 8. Java – Типы переменных
  • 9. Java – Модификаторы
  • 10. Java – Операторы
  • 11. Java – Циклы и операторы цикла
  • 11.1. Java – Цикл while
  • 11.2. Java – Цикл for
  • 11.3. Java – Улучшенный цикл for
  • 11.4. Java – Цикл do..while
  • 11.5. Java – Оператор break
  • 11.6. Java – Оператор continue
  • 12. Java – Операторы принятия решений
  • 12.1. Java – Оператор if
  • 12.2. Java – Оператор if..else
  • 12.3. Java – Вложенный оператор if
  • 12.4. Java – Оператор switch..case
  • 12.5. Java – Условный оператор (? 🙂
  • 13. Java – Числа
  • 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
  • 13.2. Java – Метод compareTo()
  • 13.3. Java – Метод equals()
  • 13.4. Java – Метод valueOf()
  • 13.5. Java – Метод toString()
  • 13.6. Java – Метод parseInt()
  • 13.7. Java – Метод Math.abs()
  • 13.8. Java – Метод Math.ceil()
  • 13.9. Java – Метод Math.floor()
  • 13.10. Java – Метод Math.rint()
  • 13.11. Java – Метод Math.round()
  • 13.12. Java – Метод Math.min()
  • 13.13. Java – Метод Math.max()
  • 13.14. Java – Метод Math.exp()
  • 13.15. Java – Метод Math.log()
  • 13.16. Java – Метод Math.pow()
  • 13.17. Java – Метод Math.sqrt()
  • 13.18. Java – Метод Math.sin()
  • 13.19. Java – Метод Math.cos()
  • 13.20. Java – Метод Math.tan()
  • 13.21. Java – Метод Math.asin()
  • 13.22. Java – Метод Math.acos()
  • 13.23. Java – Метод Math.atan()
  • 13.24. Java – Метод Math.atan2()
  • 13.25. Java – Метод Math.toDegrees()
  • 13.26. Java – Метод Math.toRadians()
  • 13.27. Java – Метод Math.random()
  • 14. Java – Символы
  • 14.1. Java – Метод Character.isLetter()
  • 14.2. Java – Метод Character.isDigit()
  • 14.3. Java – Метод Character.isWhitespace()
  • 14.4. Java – Метод Character.isUpperCase()
  • 14.5. Java – Метод Character.isLowerCase()
  • 14.6. Java – Метод Character.toUpperCase()
  • 14.7. Java – Метод Character.toLowerCase()
  • 14.8. Java – Метод Character.toString()
  • 15. Java – Строки
  • 15.1. Java – Метод charAt()
  • 15.2. Java – Метод compareTo()
  • 15.3. Java – Метод compareToIgnoreCase()
  • 15.4. Java – Метод concat()
  • 15.5. Java – Метод contentEquals()
  • 15.6. Java – Метод copyValueOf()
  • 15.7. Java – Метод endsWith()
  • 15.8. Java – Метод equals()
  • 15.9. Java – Метод equalsIgnoreCase()
  • 15.10. Java – Метод getBytes()
  • 15.11. Java – Метод getChars()
  • 15.12. Java – Метод hashCode()
  • 15.13. Java – Метод indexOf()
  • 15.14. Java – Метод intern()
  • 15.15. Java – Метод lastIndexOf()
  • 15.16. Java – Метод length()
  • 15.17. Java – Метод matches()
  • 15.18. Java – Метод regionMatches()
  • 15.19. Java – Метод replace()
  • 15.20. Java – Метод replaceAll()
  • 15.21. Java – Метод replaceFirst()
  • 15.22. Java – Метод split()
  • 15.23. Java – Метод startsWith()
  • 15.24. Java – Метод subSequence()
  • 15.25. Java – Метод substring()
  • 15.26. Java – Метод toCharArray()
  • 15.27. Java – Метод toLowerCase()
  • 15.28. Java – Метод toString()
  • 15.29. Java – Метод toUpperCase()
  • 15.30. Java – Метод trim()
  • 15.31. Java – Метод valueOf()
  • 15.32. Java – Классы StringBuilder и StringBuffer
  • 15.32.1. Java – Метод append()
  • 15.32.2. Java – Метод reverse()
  • 15.32.3. Java – Метод delete()
  • 15.32.4. Java – Метод insert()
  • 15.32.5. Java – Метод replace()
  • 16. Java – Массивы
  • 17. Java – Дата и время
  • 18. Java – Регулярные выражения
  • 19. Java – Методы
  • 20. Java – Потоки ввода/вывода, файлы и каталоги
  • 20.1. Java – Класс ByteArrayInputStream
  • 20.2. Java – Класс DataInputStream
  • 20.3. Java – Класс ByteArrayOutputStream
  • 20.4. Java – Класс DataOutputStream
  • 20.5. Java – Класс File
  • 20.6. Java – Класс FileReader
  • 20.7. Java – Класс FileWriter
  • 21. Java – Исключения
  • 21.1. Java – Встроенные исключения
  • 22. Java – Вложенные и внутренние классы
  • 23. Java – Наследование
  • 24. Java – Переопределение
  • 25. Java – Полиморфизм
  • 26. Java – Абстракция
  • 27. Java – Инкапсуляция
  • 28. Java – Интерфейсы
  • 29. Java – Пакеты
  • 30. Java – Структуры данных
  • 30.1. Java – Интерфейс Enumeration
  • 30.2. Java – Класс BitSet
  • 30.3. Java – Класс Vector
  • 30.4. Java – Класс Stack
  • 30.5. Java – Класс Dictionary
  • 30.6. Java – Класс Hashtable
  • 30.7. Java – Класс Properties
  • 31. Java – Коллекции
  • 31.1. Java – Интерфейс Collection
  • 31.2. Java – Интерфейс List
  • 31.3. Java – Интерфейс Set
  • 31.4. Java – Интерфейс SortedSet
  • 31.5. Java – Интерфейс Map
  • 31.6. Java – Интерфейс Map.Entry
  • 31.7. Java – Интерфейс SortedMap
  • 31.8. Java – Класс LinkedList
  • 31.9. Java – Класс ArrayList
  • 31.10. Java – Класс HashSet
  • 31.11. Java – Класс LinkedHashSet
  • 31.12. Java – Класс TreeSet
  • 31.13. Java – Класс HashMap
  • 31.14. Java – Класс TreeMap
  • 31.15. Java – Класс WeakHashMap
  • 31.16. Java – Класс LinkedHashMap
  • 31.17. Java – Класс IdentityHashMap
  • 31.18. Java – Алгоритмы Collection
  • 31.19. Java – Iterator и ListIterator
  • 31.20. Java – Comparator
  • 32. Java – Дженерики
  • 33. Java – Сериализация
  • 34. Java – Сеть
  • 34.1. Java – Обработка URL
  • 35. Java – Отправка Email
  • 36. Java – Многопоточность
  • 36.1. Java – Синхронизация потоков
  • 36.2. Java – Межпоточная связь
  • 36.3. Java – Взаимная блокировка потоков
  • 36.4. Java – Управление потоками
  • 37. Java – Основы работы с апплетами
  • 38. Java – Javadoc

Класс Iterator

В java.util есть класс Iterator, который может использоваться, когда итерация по списку или другой коллекции предполагает удаление элементов. Удалять элементы в цикле обхода последовательности for each нельзя.

Из списка с помощью метода iterator() создается объект-итератор, который присваивается переменной типа Iterator.

Далее из объекта-итератора в цикле извлекаются элементы с помощью метода next(). Проверка, есть ли следующий элемент, выполняется методом hasNext(). Удаляют элементы методом remove().

import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; public class IteratorTest { public static void main(String[] args) { Integer[] nums = {10, -5, 4, 8, -2, -10, 1, 4, 2}; ArrayListInteger> numList = new ArrayList<>( Arrays.asList(nums)); IteratorInteger> numListIter = numList.iterator(); while (numListIter.hasNext()) { int n = numListIter.next(); if (n  0) { numListIter.remove(); } } System.out.println(numList); } }

Примечание. В примере обычный массив преобразуется в список с помощью метода asList().

Отдельное создание итератора и передачу его в цикл while можно заменить циклом for:

for (IteratorInteger> it = numList.iterator(); it.hasNext();) { int n = it.next(); if (n  0) it.remove(); }

Однако, несмотря на наличие в Java класса Iterator, не рекомендуется его использовать в подобных целях. У коллекций есть метод removeIf(), которому передается фильтр. Если элемент подходит под него, то он также как в случае итератора безопасно удаляется. Например, команда

numList.removeIf(n -> (n  0));

удалит из списка все числа меньше нуля.

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

import java.util.HashSet; import java.util.Iterator; public class Iter  public static void main(String[] args)  HashSetString> s = new HashSet<>(); s.add("hello"); s.add("hi"); s.add("hey"); IteratorString> i = s.iterator(); while (i.hasNext())  System.out.println(i.next()); > > >

Однако вместо явного создания итераторов в таких случаях рекомендуется использовать цикл for each, в котором итератор создается неявно:

HashSetString> s = new HashSet<>(); s.add("hello"); s.add("hi"); s.add("hey"); for (String s1 : s)  System.out.println(s1); >

X Скрыть Наверх

Программирование на Java. Курс

Руководство по Java Core. Коллекции. Iterator.

Во время разработки приложений мы часто сталкиваемся с необходимостью получить доступ ко всем элементами коллекции. Например, вывести на экран эти элементы.
Самым простым и эффективным способом сделать это, является использование итератора (iterator). Итератор – это объект, который реализовывает интерфейсы Iterator, либо ListIterator.

Iterator позволяет нам получить доступ ко всем элементам коллекции и удалять те из них, которые необходимо. ListIterator является наследником Iterator и позволяет нам “пробежаться” по коллекции в обоих направлениях. ListIterator также позволяет нам изменять элементы.

Для того чтобы использовать итератор, нам прежде всего необходимо получить его. Для этого мы должны использовать метод iterator().

Итератор имеет такие методы:

  • boolean hasNext()
    Этот метод проверяет, есть ли в коллекции следующий элемент. Если есть, то метод возвращает true, если нет – false.
  • Object next()
    Этот метод возвращает следующий элемент коллекции. Если элемент не обнаружен, то метод “бросает” NoSuchElementException.
  • void remove()
    Этот метод удаляет текущий элемент. Важный момент заключается в том, что сначала этот элемент необходимо получить с помощью метода next(), если мы вызовем метод remove() до метода next(), то мы получим IllegalStateException.

ListIterator имеет больший набор методов:

  • void add(Object obj)
    Этот метод добавляет элемент в коллекцию на следующую позицию после элемента, полученного с помощью метода next().
  • boolean hasNext()
    Этот метод проверяет, есть ли в коллекции следующий элемент. Если есть, то метод возвращает true, если нет – false.
  • boolean hasPreviuos()
    Этот метод проверяет, есть ли в коллекции предыдущий элемент. Если есть, то метод возвращает true, если нет – false.
  • Object next()
    Этот метод возвращает следующий элемент коллекции. Если элемент не обнаружен, то метод “бросает” NoSuchElementException.
  • Object previous()
    Этот метод возвращает предыдущий элемент коллекции. Если элемент не обнаружен, то метод “бросает” NoSuchElementException.
  • int nextIndex()
    Этот метод возвращает индекс следующего элемента. Если в коллекции отсутствует следующий элемент – возвращается размер коллекции.
  • int previousIndex()
    Этот метод возвращает индекс предыдущего элемента. Если в коллекции отсутствует предыдущий элемент – возвращает значение -1.
  • void set(Object obj)
    Этот метод присваивает текущему элементу значение, которое передано в качестве параметра метода.
  • void remove()
    Этот метод удаляет текущий элемент. Важный момент заключается в том, что сначала этот элемент необходимо получить с помощью метода next()либо с помощью метода previous(), если мы вызовем метод remove() до метода next() или метода previous(), то мы получим IllegalStateException.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

 import java.util.*; public class IteratorDemo < public static void main(String[] args) < List arrayList = new ArrayList<>(); System.out.println("Adding elements into arrayList. "); arrayList.add(1); arrayList.add(2); arrayList.add(3); arrayList.add(4); arrayList.add(5); System.out.println("Initial arrayList content (using Iterator):"); Iterator iterator = arrayList.iterator(); while (iterator.hasNext()) < System.out.print(iterator.next() + " "); >System.out.println("\n========================\n"); System.out.println("Updating elements using ListIterator. "); ListIterator listIterator = arrayList.listIterator(); while (listIterator.hasNext()) < Integer element = (Integer) listIterator.next(); listIterator.set(element * 10); >System.out.println("\n========================\n"); System.out.println("Final arrayList content (using iterator):"); iterator = arrayList.iterator(); while (iterator.hasNext()) < System.out.print(iterator.next() + " "); >System.out.println("\n========================\n"); System.out.println("Final arrayList content (using listIterator):"); while (listIterator.hasPrevious()) < System.out.print(listIterator.previous() + " "); >System.out.println("\n========================\n"); > > 

В результате работы программы мы получим следующий результат:

 /*Some System Messages*/ Adding elements into arrayList. Initial arrayList content (using Iterator): 1 2 3 4 5 ======================== Updating elements using ListIterator. ======================== Final arrayList content (using iterator): 10 20 30 40 50 ======================== Final arrayList content (using listIterator): 50 40 30 20 10 ======================== 

В этом разделе мы изучили основы интерфейсов Iterator и ListIterator, и рассмотрели пример простого приложения с его использованием.

Полезности

Туториалы
Системный дизайн
Собеседования
Студенты
Задачи

Немного о себе

Приветствую! Меня зовут Евгений. На этом сайте я пишу о разработке программного обеспечения. Связаться со мной вы можете по email: proselytear@yahoo.com Имеет смысл, предварительно ознакомиться вот с этим FAQ разделом.

Недавние публикации
  • Механизмы CAS и FAA глазами Java разработчика
  • ExecutorService в Java и примеры его применения.
  • Особенности работы PreparedStatement в JDBC
  • Основы кэширования в Hibernate
  • Феномены чтения глазами разработчика

Copyright © 2023 PROSELYTE.

Omega WordPress Theme by ThemeHall

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *