Что такое iterator java

Что такое Iterator в Java?

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

Что такое Iterator в Java?

Iterator в Java – это интерфейс, принадлежащий платформе коллекции. Позволяет просматривать коллекцию, получать доступ к элементу данных и удаляет элементы данных коллекции.

Java в основном поддерживает четыре различных курсора. Это именно:

Каждый из этих Java-курсоров имеет свои преимущества и недостатки.

Он также считается универсальным итератором, так как вы можете применить его к любому объекту Collection. Используя Iterator, вы можете выполнять операции чтения и удаления. Это улучшенная версия перечисления с дополнительными функциями элемента.

Методы Iterator

Итератор Java имеет в общей сложности 4 метода. Давайте разберемся с ними подробно.

MethodsDescription
forEachRemaining(Consumer action)Он выполняет действия над каждым элементом до тех пор, пока все элементы не будут обработаны. Также до тех пор, пока действие не создаст исключение.
hasNext()Возвращает истинное значение, если во время итерации встречается большое количество элементов.
next()Возвращает следующий указанный элемент во время итерации.
remove()Этот метод удаляет текущий элемент. Создает исключение IllegalStateException, если предпринята попытка вызвать метод remove(), которому не предшествует вызов метода next().
boolean hasNext()Возвращает true, если итерация содержит больше элементов.

ListIterator в Java

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

Original contents of al : E D U R E K A
Modified contents of al : E + D + U + R + E + K + A+
Modified list backwards : A + K + E + R + U + D + E+

Преимущества

Итератор в Java имеет следующие преимущества.

Ограничения

Имеют следующие недостатки:

Источник

Итератор в Java

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

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

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

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

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

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

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

Пример

Вот пример, демонстрирующий как Iterator, так и ListIterator. Он использует объект ArrayList, но общие принципы применимы к любому типу коллекции. Конечно, ListIterator доступен только для тех коллекций, которые реализуют интерфейс List.

Это даст следующий результат –

Типы итераторов

Итераторы используются для обхода коллекций Java. Существует три типа итераторов.

Пример

Средняя оценка / 5. Количество голосов:

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Источник

Итераторы

— Сегодня я хочу рассказать тебе про итераторы.

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

— А что сложного в том, чтобы выдать набор элементов?

— Во-первых, некоторые коллекции, как например Set не имеют установленного порядка элементов и/или он постоянно меняется.

Во-вторых, некоторые структуры данных могут хранить объекты очень сложно: различными группами, списками и т.д. Т.е. задача отдать последовательно все элементыбудет сложной и нетривиальной.

В третьих – коллекции имеют свойство меняться. Решил ты вывести на экран все содержимое коллекции, а прямо в середине вывода JVM переключилась на другую нить, которая половину элементов из этой коллекции заменила на другую. Вот и получишь ты вместо вывода не пойми что.

— Вот! Именно такие проблемы должен был решить итератор. Итератор – это специальный внутренний объект в коллекции, который с одной стороны имеет доступ ко всем ее private данным и знает ее внутреннюю структуру, с другой – реализует общедоступный интерфейс Iterator, благодаря чему все знают, как с ним работать.

Некоторые итераторы имеют внутри себя массив, куда копируются все элементы коллекции во время создания итератора. Это гарантирует, что последующее изменение коллекции не повлияет на порядок и количество элементов.

Думаю, ты уже сталкивался с тем, что при работе с for each нельзя одновременно «идти по коллекции циклом» и удалять из нее элементы. Это все именно из-за устройства итератора.

В новых коллекциях, добавленных в библиотеке concurrency, устройство итератора переработано, поэтому там такой проблемы нет.

Давай я тебе напомню, как устроен итератор.

В Java есть специальный интерфейс Iterator, вот какие у него методы:

Методы интерфейса IteratorОписание
boolean hasNext()Проверяет, есть ли еще элементы
E next()Возвращает текущий элемент и переключается на следующий.
void remove()Удаляет текущий элемент

Итератор позволяет поочередно получить все элементы коллекции. Логичнее представить итератор чем-то вроде InputStream – у него есть все данные, но его задача выдавать их последовательно.

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

Метод hasNext() используется, чтобы проверять, есть ли еще элементы.

Ну, а remove() – удаляет текущий элемент.

— А почему методы называются так странно? Почему не isEmpty() или getNextElement()?

Разве так не логичнее?

— Логичнее, но такие названия пришли из языка C++, где итераторы появились раньше.

Кроме итератора есть еще интерфейс Iterable – его должны реализовывать все коллекции, которые поддерживают итератор. У него есть единственный метод:

Методы interface IterableОписание
Iterator iterator()Возвращает объект-итератор

С помощью этого метода у любой коллекции можно получить объект итератор для обхода ее элементов. Давай обойдем все элементы дерева в коллекции TreeSet:

Такое использование итератора не очень удобно – слишком много лишнего и очевидного кода. Ситуация упростилась, когда в Java появился цикл по итератору – for-each.

Теперь такой код гораздо компактнее и читабельнее:

Это один и тот же код! Итератор используется и там, и там.

Цикл for-each можно использовать для любых объектов, которые поддерживают итератор. Т.е. ты можешь написать свой класс, добавить ему метод iterator() и сможешь использовать его объекты в правой части конструкции for-each.

— Ого! Я, конечно, не рвусь писать собственные коллекции и итераторы, но предложение все равно заманчивое. Возьму на карандаш.

— Кроме того, есть еще одна популярная разновидность итераторов, для которой даже придумали свой интерфейс. Речь идет об итераторе для списков – ListIterator.

Списки, независимо от реализации, обладают порядком элементов, что в свою очередь позволяет работать с ними через итератор чуть более удобно.

Вот какие методы есть у интерфейса ListIterator :

МетодОписание
boolean hasNext()Проверяет, есть ли еще элементы впереди.
E next()Возвращает следующий элемент.
int nextIndex()Возвращает индекс следующего элемента
void set(E e)Меняет значение текущего элемента
boolean hasPrevious()Проверяет, есть ли элементы позади.
E previous()Возвращает предыдущий элемент
int previousIndex()Возвращает индекс предыдущего элемента
void remove()Удаляет текущий элемент
void add(E e)Добавляет элемент в список.

Т.е. тут мы можем ходить не только вперед, но и назад. И еще пара фич по мелочи.

— Что ж, интересная штука. А где его используют?

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

Источник

30.21. Java – Iterator и ListIterator

Содержание

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

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

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

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

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

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

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

Пример

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

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

Источник

Итератор

(Заранее извините за мой русский)

Представьте, что вы разработчик статегичнои военной игры. Армия имеет сложную структуру: она состоит из героя и трех групп. Когда Король издает указ и ресурсы, чтобы полечить всех воинов (Герой также является воином) Вы хотите проитеруваты по всем солдатам и вызвать метод treat () на каждом инстанси. Как это можно сделать легко и без вникания в структуру армией?

ИТЕРАТОР

Итератор это паттерн позволяющий доступатися к элементам любой коллекции без вникания в суть ее имплементации.
Таким образом в применении к нашей проблеме: Мы не хотим переживать структурой Армии — мы хотим чтобы SoldiersIterator пробежался по всем солдатам.

Красная линия на рисунке — это итератор (по крайней мере как я его себе представляю).
Что такое iterator java. Смотреть фото Что такое iterator java. Смотреть картинку Что такое iterator java. Картинка про Что такое iterator java. Фото Что такое iterator java

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

Код ниже показывает использование итератора. Как видим мы просто получили инстанс итератора SoldiersIterator. И простым циклом проходимося по всем солдатам армии. Это очень легко, что и является основной задачей итератора.

SoldiersIterator iterator = new SoldiersIterator(earthArmy);

Структура Армии

Армия состоит из одного героя и может содержать несколько групп, каждая из которых может содержать много солдат. Итак, как мы видим, сктуктура армии сложная и древовидная. Код ниже показывает создания Армии:

Group groupA = new Group();
for ( int i=1; i new Soldier( «Alpha:» + i));

Group groupB = new Group();
for ( int i=1; i new Soldier( «Beta:» + i));

Group groupC = new Group();
for ( int i=1; i new Soldier( «Gamma:» + i));

earthArmy.ArmyHero = new Hero( «Andriy Buday» );
earthArmy.addArmyGroup(groupB);
earthArmy.addArmyGroup(groupA);
earthArmy.addArmyGroup(groupC);

Герой (Hero) это класс унаслидуваний от солдата (Soldier) и основная разница такова, что он имеет более высокий уровень здоровья.

public class Soldier <
public String Name;
public int Health;
protected int maxHealthPoints = 100;

public Soldier( String name) <
Name = name;
>

public class Hero extends Soldier <
protected int maxHealthPoints = 500;

public Hero( String name) <
super(name);
>
>

SoldiersIterator

Поэтому, если мы можем двигаться по сложной коллекции так легко, где есть вся сложность?
Конечно, она скрыта инкапсулированные в конкретном классе итератора.

private Army _army;
boolean heroIsIterated;
int currentGroup;
int currentGroupSoldier;

public SoldiersIterator(Army army) <
_army = army;
heroIsIterated = false ;
currentGroup = 0;
currentGroupSoldier = 0;
>

public boolean hasNext() <
if (!heroIsIterated) return true ;
if (currentGroup return true ;
if (currentGroup == _army.ArmyGroups.size()-1)
if (currentGroupSoldier get (currentGroup).Soldiers.size()) return true ;

public Soldier next() <
Soldier nextSoldier;
// we still not iterated all soldiers in current group
if (currentGroup if (currentGroupSoldier get (currentGroup).Soldiers.size()) <
nextSoldier = _army.ArmyGroups. get (currentGroup).Soldiers. get (currentGroupSoldier);
currentGroupSoldier++;
>
// moving to next group
else <
currentGroup++;
currentGroupSoldier = 0;
return next();
>
>
// hero is the last who left the battlefield
else if (!heroIsIterated) <
heroIsIterated = true ;
return _army.ArmyHero;
> else <
// THROW EXCEPTION HERE
throw new IllegalStateException( «End of colletion» );
//or set all counters to 0 and start again, but not recommended
>
return nextSoldier;
>
>

Чем мой пример отличается от стандартного GoF?

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

Например, я создавал нужный нам итератор следующим образом:

SoldiersIterator iterator = new SoldiersIterator (earthArmy);

Но обычно создания итератора также инкапсулюеться под методом агрегата (как GetEnumerator в. NET). Мой код мог бы выглядеть так:

IIterator iterator = AbstractArmy.GetSoldiersIterator ();

var list = new List int > ();
//GetEnumerator is method of IEnumerator (Aggregate)
var enumerator = list.GetEnumerator ();
//MoveNext method of IEnumerable (Iterator)
enumerator.MoveNext ();

Источник

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

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