数据结构(八) -- 迭代器

一,迭代器

在对向量、列表和序列进行处理(比如,查找某一特定的元素)时,一种典型的操作就是依次访问或修改其中的各个元素。迭代器是软件设计的一种模式,它是对** “逐一访问所有元素” **这类操作的抽象。

迭代器本身也是一个序列S,在任何时候,迭代器中都有唯一的当前元素。迭代器还必须提供某种机制,使得我们可以不断转向S中的下一元素,并将其置为新的当前元素。与前面所介绍的** 位置ADT 相比,迭代器是对前者的扩展与推广。 实际上,一个位置本身已经可以被看作是一个迭代器了,只不过它还不能不断更新。 ** 总之,所谓迭代器,就是对一组对象之间的位置、直接后继等关系的集成。


二,迭代器ADT(AbstractDataType)

操作方法 功能描述
hasNext() 检查迭代器中是否还有剩余的元素
输入:无
输出:布尔标志
getNext() 返回迭代器中的下一元素
输入:无
输出:对象

三,基于列表实现的迭代器

接口:

package dsa.Iterator;

/*
 * 迭代器ADT接口
 */
public interface Iterator {
    boolean hasNext();// 检查迭代器中是否还有剩余的元素

    Object getNext();// 返回迭代器中的下一元素
}

异常:

package dsa.Iterator;

public class ExceptionNoSuchElement extends RuntimeException {

    public ExceptionNoSuchElement(String err) {
        super(err);
    }

}

  • 基于列表实现的位置迭代器:
package dsa.Iterator;

import dsa.List.List;
import other.Position;

/*
 * 基于列表实现的位置迭代器
 */
public class IteratorPosition implements Iterator {
    private List list;// 列表
    private Position nextPosition;// 当前(下一个)位置
    // 默认构造方法

    public IteratorPosition() {
        list = null;
    }

    // 构造方法
    public IteratorPosition(List L) {
        list = L;
        if (list.isEmpty())// 若列表为空,则
            nextPosition = null;// 当前位置置空
        else
            // 否则
            nextPosition = list.first();// 从第一个位置开始
    }

    // 检查迭代器中是否还有剩余的位置
    public boolean hasNext() {
        return (nextPosition != null);
    }

    // 返回迭代器中的下一位置
    public Object getNext() throws ExceptionNoSuchElement {
        if (!hasNext())
            throw new ExceptionNoSuchElement("意外:没有下一位置");
        Position currentPosition = nextPosition;
        if (currentPosition == list.last())// 若已到达尾位置,则
            nextPosition = null;// 不再有下一个位置
        else
            // 否则
            nextPosition = list.getNext(currentPosition);// 转向下一位置
        return currentPosition;
    }
}
  • 基于列表实现的元素迭代器:
package dsa.Iterator;

import other.Position;
import dsa.List.List;

/*
 * 基于列表实现的元素迭代器
 */
public class IteratorElement implements Iterator {
    private List list;// 列表
    private Position nextPosition;// 当前(下一个)元素的位置

    // 默认构造方法

    public IteratorElement() {
        list = null;
    }

    // 构造方法
    public IteratorElement(List L) {
        list = L;
        if (list.isEmpty())// 若列表为空,则
            nextPosition = null;// 当前元素置空
        else
            // 否则
            nextPosition = list.first();// 从第一个元素开始
    }

    // 检查迭代器中是否还有剩余的元素
    public boolean hasNext() {
        return (null != nextPosition);
    }

    // 返回迭代器中的下一元素
    public Object getNext() throws ExceptionNoSuchElement {
        if (!hasNext())
            throw new ExceptionNoSuchElement("意外:没有下一元素");
        Position currentPosition = nextPosition;
        if (currentPosition == list.last())// 若已到达尾元素,则
            nextPosition = null;// 不再有下一元素
        else
            // 否则
            nextPosition = list.getNext(currentPosition);// 转向下一元素
        return currentPosition.getElem();
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,884评论 25 707
  • 1 场景问题# 1.1 工资表数据的整合## 考虑这样一个实际应用:整合工资表数据。 这个项目的背景是这样的,项目...
    七寸知架构阅读 2,539评论 0 53
  • 安逸的日子过了一段时间,突然一天晚上强哥对我说明天要早起到备件库的办公室上班,因为项目经理明天会来,我听后点点头。...
    婚恋新观阅读 170评论 0 0
  • 小和尚四岁举家逃难到寺门口 全家十一口只有他留了下了 因为主持说他与佛有缘 法号就叫慧根 十九岁那年山下妖魔作乱,...
    一浮白阅读 118评论 0 1