Java - 如何使用 Iterator?
Iterator
通常,你会想要遍历集合中的元素。例如,你可能想要显示每个元素。最简单的方法是使用 iterator,它是一个实现了 Iterator 或 ListIterator 接口的对象。
Iterator 使你能够遍历集合,获取或移除元素。ListIterator 扩展了 Iterator,允许对列表进行双向遍历并修改元素。
在通过 iterator 访问集合之前,你必须先获取一个。每个集合类都提供了一个 iterator( ) 方法,它返回指向集合起始位置的 iterator。通过使用这个 iterator 对象,你可以一次访问集合中的每个元素。
语法
以下是声明 iterator 接口的语法 −
public interface Iterator<E>
这里,"E" 是该接口返回的元素的类型。
使用 Iterator 接口
一般来说,要使用 iterator 遍历集合的内容,首先导入 java.util.Iterator 库,然后按照以下步骤操作 −
Step 1
通过调用集合的 iterator( ) 方法 获取指向集合起始位置的 iterator。
Iterator<Data_Type> iterator_Name = collection_Name.iterator();
Step 2
设置一个 while 循环,调用 hasNext( ) 方法。只要 hasNext( ) 返回 true,循环就继续迭代。
while(iterator_Name.hasNext()){
//要执行的操作
}
Step 3
在 while 循环中,通过调用 next( ) 方法 获取每个元素。这里,我们正在打印 Collection 中的元素。
System.out.println(iterator_Name.next());
对于实现了 List 的集合,你也可以通过调用 ListIterator 来获取 iterator。
Iterator 接口声明的方法
以下是 Java 中 iterator interface 支持的方法 −
| 序号 | 方法 & 描述 |
|---|---|
| 1 |
boolean hasNext( ) 如果还有更多元素,则返回 true。否则,返回 false。 |
| 2 |
Object next( ) 返回下一个元素。如果没有下一个元素,则抛出 NoSuchElementException。 |
| 3 |
void remove( ) 移除当前元素。如果在调用 next( ) 之前尝试调用 remove( ),则抛出 IllegalStateException。 |
示例
以下是一个演示 Iterator 的示例。它使用 ArrayList 对象,但通用原则适用于任何类型的 collection。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String args[]) {
// 创建一个数组列表
List<String> al = new ArrayList<>();
// 向数组列表添加元素
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
// 使用 iterator 显示 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();
}
}
输出
Original contents of al: C A E B D F
在 Iterator 中使用 var 关键字
var 关键字 可以代替 Iterator<String> 使用,以避免重复长类型名称,从而减少代码量。由于 var 关键字是在 Java 10 中引入的,在较旧的 Java 版本中无法使用。
示例
以下是一个演示在 Java 中与 Iterators 一起使用 var 关键字的示例 −
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String args[]) {
// 创建一个数组列表
List<String> al = new ArrayList<>();
// 向数组列表添加元素
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
//使用 var 关键字的 iterator 显示 al 的内容
System.out.print("Original contents of al: ");
var itr = al.iterator();
while(itr.hasNext()) {
System.out.print(itr.next() + " ");
}
System.out.println();
}
}
输出
Original contents of al: C A E B D F
ListIterator
ListIterator 也是一种 iterator 类型,它允许我们双向遍历列表、在迭代时修改列表,并获取iterator 在列表中的索引。ListIterator 仅适用于实现 List interface 的 collection。
ListIterator 基于光标位置工作,该位置位于previous() 方法将返回的元素和next() 方法将返回的元素之间。
语法
以下是在 Java 中初始化 ListIterator 的语法 −
ListIterator<Data_Type> iterator_Name = List_Interface.listIterator();
ListIterator 声明的方法
以下是 Java 中 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( ) 从列表中移除当前元素。如果在调用 next( ) 或 previous( ) 之前调用 remove( ),则抛出 IllegalStateException。 |
| 9 |
void set(Object obj) 将 obj 赋给当前元素。此元素是最近一次调用 next( ) 或 previous( ) 返回的元素。 |
示例 1
以下示例演示了 ListIterator 的使用。它使用 ArrayList 对象,但通用原则适用于任何类型的 collection。
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[]) {
// 创建一个数组列表
List<String> al = new ArrayList<>();
// 向数组列表中添加元素
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
// 使用 iterator 显示 al 的内容
System.out.print("al 的原始内容: ");
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
}
}
输出
al 的原始内容: C A E B D F
示例 2
以下示例演示了在使用 ListIterator 迭代时修改列表。它使用 ArrayList 对象,但通用原则适用于任何类型的 collection。
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[]) {
// 创建一个数组列表
List<String> al = new ArrayList<>();
// 向数组列表中添加元素
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
// 使用 iterator 显示 al 的内容
System.out.print("al 的原始内容: ");
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
// 修改正在迭代的对象
ListIterator<String> 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+