Перейти к контенту

Итератор в Java

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

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

 

Прежде чем сможете получить доступ к коллекции через итератор, вы должны получить ее. Каждый из классов коллекции предоставляет метод 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(). Возвращает следующий элемент. NoSuchElementException генерируется, если нет следующего элемента.
  5. int nextIndex(). Возвращает индекс следующего элемента. Если следующего элемента нет, возвращает размер списка.
  6. Object previous(). Возвращает предыдущий элемент. NoSuchElementException генерируется, если нет предыдущего элемента.
  7. int previousIndex(). Возвращает индекс предыдущего элемента. Если предыдущего элемента нет, возвращает -1.
  8. void remove(). Удаляет текущий элемент из списка. IllegalStateException генерируется, если remove() вызывается перед вызовом next() или previous().
  9. void set (Object obj). Назначает объект текущему элементу. Этот элемент последний раз возвращается при вызове next () или previous ().

Пример

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

import java.util.*;
public class IteratorDemo {

   public static void main(String args[]) {
      // Create an array list
      ArrayList al = new ArrayList();
      
      // add elements to the array list
      al.add("C");
      al.add("A");
      al.add("E");
      al.add("B");
      al.add("D");
      al.add("F");

      // Use iterator to display contents of al
      System.out.print("Original contents of al: ");
      Iterator itr = al.iterator();
      
      while(itr.hasNext()) {
         Object element = itr.next();
         System.out.print(element + " ");
      }
      System.out.println();
      
      // Modify objects being iterated
      ListIterator litr = al.listIterator();
      
      while(litr.hasNext()) {
         Object element = litr.next();
         litr.set(element + "+");
      }
      System.out.print("Modified contents of al: ");
      itr = al.iterator();
      
      while(itr.hasNext()) {
         Object element = itr.next();
         System.out.print(element + " ");
      }
      System.out.println();

      // Now, display the list backwards
      System.out.print("Modified list backwards: ");
      
      while(litr.hasPrevious()) {
         Object element = litr.previous();
         System.out.print(element + " ");
      }
      System.out.println();
   }
}

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

Итог

Original contents of al: C A E B D F
Modified contents of al: C+ A+ E+ B+ D+ F+
Modified list backwards: F+ D+ B+ E+ A+ C+

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

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

  • Перечисление — Enumeration — это начальные итераторы, введенные в jdk 1.0 и предназначенные только для более старых коллекций, таких как vector или hashTables. Может использоваться только для прямой навигации. Элемент нельзя удалить с помощью перечисления.
  • Итератор — Iterator — является универсальным итератором, представленным в Jdk 1.2, может использоваться для любых коллекций и только для навигации вперед. Элемент можно удалить с помощью итератора, если метод удаления поддерживается.
  • ListIterator — является итератором для коллекций типов List и поддерживает двунаправленную навигацию.

Пример

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

public class Tester{

   public static void main(String[] args) throws ClassNotFoundException { 
      Vector<Integer> vector = new Vector<>();
      vector.add(1);vector.add(2);vector.add(3);

      System.out.println("Vector: ");
      Enumeration<Integer> enumeration = vector.elements();
      while(enumeration.hasMoreElements()){
         System.out.print(enumeration.nextElement() + " ");
      }

      List<Integer> list = new ArrayList<Integer>();
      list.add(1);list.add(2);list.add(3);

      System.out.println("\nList: ");
      Iterator<Integer> iterator = list.iterator();
      while(iterator.hasNext()){
         System.out.print(iterator.next() + " ");
      }

      System.out.println("\nList using ListItertor (Forward): ");
      ListIterator<Integer> listIterator = list.listIterator();
      while(listIterator.hasNext()){
         System.out.print(listIterator.next() + " ");
      }
      System.out.println("\nList using ListItertor (Backward): ");
      while(listIterator.hasPrevious()){
         System.out.print(listIterator.previous() + " ");
      }   
   }   
}

Итог

Vector: 
1 2 3 
List: 
1 2 3 
List using ListItertor (Forward): 
1 2 3 
List using ListItertor (Backward): 
3 2 1 

Оцени статью

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

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

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

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

Помогите улучшить статью.

 

Пока нет комментариев.

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

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)