zoukankan      html  css  js  c++  java
  • JavaSE 迭代器

    1. 基本概念

    迭代器(iterator)是一个能遍历数据集合的对象。在遍历过程中,可以查看数据项、修改数据项、添加数据项及删除数据项。

    Java 类库中含有多个接口,定义了用于迭代器的方法。下面介绍其中的两个接口 Iterator 和 Iterable,它们分别来自 java.util 和 java.lang 包。

    2. 接口 Iterator

    Java 的接口 java.util.Iterator 中使用泛型表示迭代时要处理的项的数据类型。接口中说明了 3 个方法,分别是 hasNext、next 和 remove。

    • 方法 hasNext():查看迭代器是否有下一项返回。如果有,则 返回 true,且方法 next() 将迭代器游标移过下个元素,并返回指向该元素的引用;如果返回 false,则 抛出 NoSuchElementException 异常。
    • 方法 remove():可以删除调用 next() 时最后返回的项,如果不允许迭代器进行删除,则只需要抛出异常 UnsupportedOperationException。必须先调用 next() 才能使用 remove(),且每次调用 next() 之后只能进行一次本方法。

    接口 Iterator 中提到的异常,都是运行时异常,故不需要在任何方法头部写 throws 子句。另外,也不需要写 try-catch 块。但是,必须从包 java.util 引入 NoSuchElementException。

    迭代器中使用游标表示其中的位置。假定数据集合中有A、B、C、D,则游标可能的位置如下:
    迭代器中可能的游标位置

    可以看出,若集合中有 4 个元素,则游标的位置可能有 5 个。

    初始时,游标在最前面的一个位置。每执行一次 next() 方法,游标移过下一项。当到达最后一个位置时,调用 hasNext() 时会返回 false。

    假定,迭代器的游标当前位置在 A 和 B 之间,如图(a)所示。则执行 next() 方法后,游标位置在 B 和 C 之间,且 next() 方法的返回值是 B,如图(b)所示。
    图(a)
    图(a)
    图(b)

    重复调用 next 可以在集合中进行遍历。迭代过程中,迭代器返回一项又一项。一旦 next 已经到达集合中的最后一项,后面再调用它都会引发 NoSuchElementException 异常。

    方法 remove 删除 next 刚返回的项。如图(b),如果在 next() 方法之后调用 remove(),则将从集合中删除 B,不过,游标位置不变,仍在 C 之前。

    3. 接口Iterable

    让一个类实现标准接口 java.lang.Iterable,也可以得到迭代器。接口 Iterable 仅声明了一个方法 iterator,它返回一个符合 Iterator 接口的迭代器。如下所示:

    package java.lang
    public interface Iterable<T>
    {
       Iterator<T> iterator();
    }
    

    使用迭代器示例

    ListInterface<String> nameList = new MyList<> ();
    nameList.add("A ");
    nameList.add("B ");
    nameList.add("C ");
    

    要得到 nameList 的迭代器,可以调用 nameList 的方法 iterator(),如下所示。

    Iterator<String> nameIterator = nameList.iterator();
    
  • 相关阅读:
    [Trie][并查集]JZOJ 5822 量子纠缠
    [模拟]JZOJ 5820 非法输入
    SAM模板
    [树形DP]JZOJ 5819 大逃杀
    [MST][dij]JZOJ 5818 做运动
    [暴力]JZOJ 5817 抄代码
    [概率期望][树形DP][LCA]JZOJ 5814 树
    认证组件
    注册接口
    视图家族 & 路由组件
  • 原文地址:https://www.cnblogs.com/john1015/p/13887761.html
Copyright © 2011-2022 走看看