通常,您会希望循环访问集合中的元素。例如,您可能想要显示每个元素。最简单的方法是使用迭代器,它是一个实现 Iterator 或 ListIterator 接口的对象。
Iterator 使您能够循环访问集合,获取或删除元素。 ListIterator 扩展了 Iterator 以允许双向遍历列表以及修改元素。
在通过迭代器访问集合之前,您必须先获取一个迭代器。每个集合类都提供一个 iterator() 方法,该方法将迭代器返回到集合的开头。通过使用此迭代器对象,您可以访问集合中的每个元素,一次一个元素。
通常,要使用迭代器循环访问集合的内容,请按照以下步骤操作 -
通过调用集合的 iterator( ) 方法获取到集合开头的迭代器。
设置调用 hasNext() 的循环。只要 hasNext( ) 返回 true,就让循环迭代。
在循环内,通过调用 next( ) 获取每个元素。
对于实现List的集合,还可以通过调用ListIterator来获取迭代器。
Iterator声明的方法
序号 | 方法及说明 |
---|---|
1 | boolean hasNext( ) 如果有更多元素,则返回 true。否则,返回 false。 |
2 | Object next( ) 返回下一个元素。如果没有下一个元素,则抛出 NoSuchElementException。 |
3 | void remove( ) 删除当前元素。如果尝试调用remove()且之前没有调用next(),则抛出IllegalStateException。 |
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
这是一个演示迭代器的示例。它使用 ArrayList 对象,但一般原则适用于任何类型的集合。
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");
//使用迭代器显示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();
}
}
输出
Original contents of al: C A E B D F
示例 2
这里是演示 ListIterator 的示例。它使用 ArrayList 对象,但一般原则适用于任何类型的集合。
当然,ListIterator 仅适用于那些实现 List 接口的集合。
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");
//使用迭代器显示al的内容
System.out.print("Original contents of al: ");
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
}
}
输出
Original contents of al: C A E B D F
示例 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[]) {
//创建数组列表
List<String> al = new ArrayList<>();
//向数组列表添加元素
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
//使用迭代器显示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();
//修改正在迭代的对象
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();
// 现在,向后显示列表
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+