常用接口 - 迭代器Iterator
迭代器接口
已经在文章中(抽象数据结构的实现 - 栈、队列、背包)讨论过了,回头来看探索之路非常曲折,这里做一个记录
作用
实现拿来就能for的快乐遍历
实现结构
这里以类 Stack
为例,说明实现迭代器的完整流程
1.类主体实现泛型接口 Iterable<>
public class Stack<T> implements 自己的接口<T>, Iterable<T> {}
2.内部类实现泛型接口 Iterator<>
这里要注意的是,内部类StackIterator
不是泛型,就是一个普通类
private class StackIterator implements Iterator<T> {}
重写 Iterator 接口方法
当然 StackIterator 类也要实现 Iterator 接口的方法,目前我常用的方法有 remove(), hasNext(), next()
这里直接用IDEA创建结构就好了
当然要按照接口定义数据类型返回
尤其是hasNext()
这一方法,文字上理解为是否需要遍历下一个元素
实际使用时应到保证下一个元素存在时,书写的条件能够使迭代器遍历到下一个元素
这一条件在链表中表现为 nodeNow != null
,也即当前的节点非空
@Override
public void remove() {
// 实现remove方法
}
@Override
public boolean hasNext() {
// 实现hasNext方法
}
@Override
public T next() {
// 实现next方法
}
3.内部类实现泛型方法 iterator()
这里直接使用DIEA的重写自动创建就行了,修改返回内容为下面的程序体
public Iterator<T> iterator(){
return new StackIterator();
}
完整迭代器用例
仍然以 Stack
为例
public class Stack<T> implements 自己的接口<T>, Iterable<T> {
private class StackIterator implements Iterator<T> {
@Override
public void remove() {
;// 实现remove方法
}
@Override
public boolean hasNext() {
;// 实现hasNext方法
}
@Override
public T next() {
;// 实现next方法
}
}
public Iterator<T> iterator(){
return new StackIterator();
}
}