Итераторы

Последнее обновление: 25.04.2018

Одним из ключевых методов интерфейса Collection является метод Iterator<E> iterator(). Он возвращает итератор - то есть объект, реализующий интерфейс Iterator.

Интерфейс Iterator имеет следующее определение:

public interface Iterator <E>{
    
	E next();
	boolean hasNext();
	void remove();
}

Реализация интерфейса предполагает, что с помощью вызова метода next() можно получить следующий элемент. С помощью метода hasNext() можно узнать, есть ли следующий элемент, и не достигнут ли конец коллекции. И если элементы еще имеются, то hasNext() вернет значение true. Метод hasNext() следует вызывать перед методом next(), так как при достижении конца коллекции метод next() выбрасывает исключение NoSuchElementException. И метод remove() удаляет текущий элемент, который был получен последним вызовом next().

Используем итератор для перебора коллекции ArrayList:

import java.util.*;

public class Program {

    public static void main(String[] args) {
        
        ArrayList<String> states = new ArrayList<String>();
        states.add("Germany");
        states.add("France");
        states.add("Italy");
        states.add("Spain");
        
        Iterator<String> iter = states.iterator();
        while(iter.hasNext()){
        
            System.out.println(iter.next());
        }
    }
}

Интерфейс Iterator предоставляет ограниченный функционал. Гораздо больший набор методов предоставляет другой итератор - интерфейс ListIterator. Данный итератор используется классами, реализующими интерфейс List, то есть классами LinkedList, ArrayList и др.

Интерфейс ListIterator расширяет интерфейс Iterator и определяет ряд дополнительных методов:

  • void add(E obj): вставляет объект obj перед элементом, который должен быть возвращен следующим вызовом next()

  • boolean hasNext(): возвращает true, если в коллекции имеется следующий элемент, иначе возвращает false

  • boolean hasPrevious(): возвращает true, если в коллекции имеется предыдущий элемент, иначе возвращает false

  • E next(): возвращает текущий элемент и переходит к следующему, если такого нет, то генерируется исключение NoSuchElementException

  • E previous(): возвращает текущий элемент и переходит к предыдущему, если такого нет, то генерируется исключение NoSuchElementException

  • int nextIndex(): возвращает индекс следующего элемента. Если такого нет, то возвращается размер списка

  • int previousIndex(): возвращает индекс предыдущего элемента. Если такого нет, то возвращается число -1

  • void remove(): удаляет текущий элемент из списка. Таким образом, этот метод должен быть вызван после методов next() или previous(), иначе будет сгенерировано исключение IlligalStateException

  • void set(E obj): присваивает текущему элементу, выбранному вызовом методов next() или previous(), ссылку на объект obj

Используем ListIterator:

import java.util.*;

public class Program {

    public static void main(String[] args) {
        
        ArrayList<String> states = new ArrayList<String>();
        states.add("Germany");
        states.add("France");
        states.add("Italy");
        states.add("Spain");
        
        ListIterator<String> listIter = states.listIterator();
        
        while(listIter.hasNext()){
        
            System.out.println(listIter.next());
        }
        // сейчас текущий элемент - Испания
        // изменим значение этого элемента
        listIter.set("Португалия");
        // пройдемся по элементам в обратном порядке
        while(listIter.hasPrevious()){
        
            System.out.println(listIter.previous());
        }    
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850