通常,需要遍历集合中的元素。例如,希望显示每个元素。最简单的方法是使用迭代器,它是一个实现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() 最后返回的元素。 |
示例
这是一个演示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();
// 向 ArrayList 添加元素
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("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("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("修改后列表向后遍历: ");
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+