迭代器的作用是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。
java中的很多容器都实现了Iterable接口,容器中的元素都是可以遍历的。
如下例,list容器中存储的是Integer对象,list可以返回一个Iterator对象用于遍历list中的元素。
// list中存储的是Integer对象 List<Integer> list = Arrays.asList(1,2,3,4,5); // 容器List实现了Iterable接口,也即实现了iterator()方法 // 该方法可以生成一个迭代器遍历list中的元素 Iterator<Integer> iterator = list.iterator(); // 使用迭代器iterator遍历list中的每一个元素,并打印出来 while(iterator.hasNext()) System.out.print(iterator.next() + " ");
一种更为简洁的写法是:
// list中存储的是Integer对象 List<Integer> list = Arrays.asList(1,2,3,4,5); // 遍历list中的每一个元素,并打印出来
for (int x:list) System.out.print(x + " ");
迭代的实现
如果要写一个容器类,并使其具有迭代功能,该类应满足如下两个要求:
该类需继承Iterable接口,实现接口的iterator()方法;
定义一个实现Iterator接口的类,实现接口的hasNext()方法与next()方法。
如定义类Bag(背包)用于存储数据元素。
public class Bag<Item> { private class Node { Item item; Node next; } private Node first; private int N; public boolean isEmpty() {return N==0;} public int size() {return N;} public void add(Item item) { Node temp = new Node(); temp.item = item; temp.next = first; first = temp; } }
若要使容器Bag可迭代,Bag需要定义一个实现Iterator接口的类(BagIterator),该类中的hasNext()与next()方法可以帮助遍历元素。
private class BagIterator implements Iterator<Item> { private Node current = first; @Override public boolean hasNext() { return current != null; } @Override public Item next() { Item temp = current.item; current = current.next; return temp; } }
Bag需要实现Iterable接口,该接口的Iterator()方法,可以返回一个上述的迭代器(BagIterator)
public class Bag<Item> implements Iterable<Item>
@Override public Iterator<Item> iterator() { return new BagIterator(); }
完整代码如下:
import java.util.Iterator; public class Bag<Item> implements Iterable<Item>{ private class Node { Item item; Node next; } private Node first; private int N; public boolean isEmpty() {return N==0;} public int size() {return N;} public void add(Item item) { Node temp = new Node(); temp.item = item; temp.next = first; first = temp; } private class BagIterator implements Iterator<Item> { private Node current = first; @Override public boolean hasNext() { return current != null; } @Override public Item next() { Item temp = current.item; current = current.next; return temp; } } @Override public Iterator<Item> iterator() { return new BagIterator(); } }
测试如下:
public static void main(String[] args) { Bag<Integer> bag = new Bag<>(); bag.add(3); bag.add(2); bag.add(3); bag.add(1); for (int i:bag) System.out.println(i); }
输出结果:
1
3
2
3