自定义数据类型的迭代器实现
Iterable与Iterator:
Iterable:
Iterator:
实现迭代流程:
我们可以在需要迭代的数据类型(如队列Queue)中实现Iterable接口,然后实现方法iterator()并返回一个Iterator类型的迭代器(实现Iterator接口的内部嵌套类(如 ListIterator,此处的 ListIterator不同于jdk中的 ListIterator)以便访问该数据类型的实例变量),此时要引入java.util.Iterator类,但无需引入Iterable类(因为此类在lang包下默认引入)。
例(自定义数据类型Queue):
// 此时要引入java.util.Iterator类,但无需引入Iterable类(因为此类在lang包下默认引入)
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Queue<Item> implements Iterable<Item> {
private int n; // number of elements on queue
private Node first; // beginning of queue
private Node last; // end of queue
// helper linked list class
private class Node {
private Item item; // the item in the node
private Node next; // reference to next item
}
/** * Initializes an empty queue. */
public Queue() {
first = null;
last = null;
n = 0;
}
/** * Returns an iterator that iterates over the items in this queue in FIFO order. * * @return an iterator that iterates over the items in this queue in FIFO order */
//此处为Queue实现Iterable接口的方法:
public Iterator<Item> iterator() {
return new ListIterator();
}
// an iterator, doesn't implement remove() since it's optional
// 此处ListIterator为内部嵌套类,这样便于访问实例变量
private class ListIterator implements Iterator<Item> {
private Node current = first; // node containing current item
//此处为ListIterator内部嵌套类实现Iterator接口的方法:
public boolean hasNext() {
return current != null;
}
public void remove() {
throw new UnsupportedOperationException();
}
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
}
...
}