Java 简明教程

Java - How to Use Iterator?

通常,您会希望循环访问 collection 中的元素。例如,您可能需要显示每个元素。执行此操作的最简单方法是使用迭代器,该迭代器是实现 Iterator 或 ListIterator 接口的 object

Iterator 让您可以循环处理集合,获取或移除元素。ListIterator 扩展 Iterator 以允许双向遍历列表并修改元素。

在您可以通过迭代器访问集合之前,必须获取一个迭代器。每个集合类都提供了一个 iterator( ) 方法,该方法返回一个迭代器,用于集合的开始。通过使用此迭代器对象,您可以一次访问集合中的每个元素。

一般来说,要使用迭代器循环处理集合的内容,请执行以下步骤:

  1. 通过调用集合的 iterator( ) 方法来获取一个用于集合起始位置的迭代器。

  2. 设置一个循环,该循环调用 hasNext( )。让循环迭代,只要 hasNext( ) 返回 true。

  3. 在循环内,通过调用 next( ) 来获取每个元素。

对于实现 List 的集合,您还可以通过调用 ListIterator 来获取一个迭代器。

The Methods Declared by Iterator

Sr.No.

Method & Description

1

boolean hasNext( ) 返回 true,如果还有更多元素。否则,返回 false。

2

Object next( ) 返回下一个元素。如果没有下一个元素,则抛出 NoSuchElementException。

3

void remove( ) 删除当前元素。如果没有先调用 next( ),那么尝试调用 remove( ) 将抛出 IllegalStateException。

The Methods Declared by ListIterator

Sr.No.

Method & Description

1

void add(Object obj) 在 next( ) 的下一个调用将返回的元素之前,将 obj 插入到列表中。

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( ) 从列表中移除当前元素。如果在调用 next() 或 previous() 之前调用 remove() ,则抛出 IllegalStateException。

9

void set(Object obj) 将对象分配给当前元素。这是由前一个 next() 或 previous() 调用最后返回的元素。

Example 1

以下示例演示了 Iterator 的使用。它使用了一个 ArrayList 对象,但一般原理适用于任何类型的集合。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorDemo {

   public static void main(String args[]) {
      // Create an array list
      List<String> 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<String> itr = al.iterator();

      while(itr.hasNext()) {
         Object element = itr.next();
         System.out.print(element + " ");
      }
      System.out.println();
   }
}

Output

Original contents of al: C A E B D F

Example 2

以下示例演示了 ListIterator 的使用。它使用了一个 ArrayList 对象,但一般原理适用于任何类型的集合。

List interface 列表迭代器当然仅对实现了 List interface 的集合可用。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class IteratorDemo {

   public static void main(String args[]) {
      // Create an array list
      List<String> 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<String> itr = al.iterator();

      while(itr.hasNext()) {
         Object element = itr.next();
         System.out.print(element + " ");
      }
   }
}

Output

Original contents of al: C A E B D F

Example 3

以下示例演示了 ListIterator 如何在迭代时修改列表。它使用了一个 ArrayList 对象,但一般原理适用于任何类型的集合。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class IteratorDemo {

   public static void main(String args[]) {
      // Create an array list
      List<String> 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<String> itr = al.iterator();

      while(itr.hasNext()) {
         Object element = itr.next();
         System.out.print(element + " ");
      }
      System.out.println();

      // Modify objects being iterated
      ListIterator<String> 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();
   }
}

Output

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+