常用接口 - 迭代器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();
    }
 
}
posted @ 2021-12-21 16:29  jentreywang  阅读(82)  评论(0编辑  收藏  举报