【问题标题】:Why iterator doesn't have any reset method?为什么迭代器没有任何重置方法?
【发布时间】:2011-12-03 02:33:59
【问题描述】:

为什么?以及将迭代器项指针移动到第一个位置的最佳方法是什么?

【问题讨论】:

    标签: java collections iterator


    【解决方案1】:

    提示:改为将迭代器变量创建为函数,然后您可以根据需要多次使用它。这仅适用于底层逻辑可重复的情况。

    Scala 中的示例(Java 类似,但我手边没有 Java REPL)

    def i = (1 to 100) iterator   // i is our iterator
    i.grouped(50) foreach println // prints two groups
    i.grouped(50) foreach println // prints same two groups again
    

    【讨论】:

      【解决方案2】:

      这是 JCF 采用的普遍趋势 - 保持界面简约,除非这会使某些功能极难使用。这就是为什么你没有单独的语义接口的原因,比如不可变集合、固定大小的集合..

      至于为什么提供remove(Object)(作为可选) - 不提供这将导致在迭代集合时无法安全地从集合中删除项目 - 没有什么可以提供reset() 所以强制。

      再次,为什么有一个单独的ListIterator()(提供previous()previousIndex() 之类的方法) - 使用List 接口,使用它时的主要功能是能够对元素进行布局index,并能够使用 index-order 访问它们,无论是固定顺序还是随机顺序。其他集合则不是这种情况。不为List 提供此接口将使得即使不是不可能顺利使用列表也非常困难。

      【讨论】:

      • 几乎任何IteratableIterator 都可以完成一些事情,这些事情本来可以有用地包含在界面中,但没有。有用的迭代器方法将包括 skip [相当于 N 个连续的移动调用,尽管许多迭代器可以在 O(1) 时间内实现它] 和 copyLocation [这将返回一个迭代器,该迭代器预计会产生与原始相同的项目]。任何迭代器都可以实现skip 方法,并且任何非巨大的有限迭代器都可以通过将自身枚举到一个数组中来实现copyLocation,然后将它和副本都...
      • ...从该数组返回项目。客户端代码可以自己执行任一操作,但如果迭代器具有客户端代码所缺乏的关于其内部工作的特殊知识,它可以使用这些知识来提供多个数量级的速度改进。
      【解决方案3】:

      为什么?

      因为如果你强制迭代器有一个重置方法每个迭代器必须有一个重置方法。这给了每个迭代器编写者额外的工作。另外,有些迭代器真的很难(或真的很昂贵)重置,而且你不希望用户对它们调用重置。文件或流上的迭代器就是很好的例子。

      将迭代器项指针移动到第一个位置的最佳方法是什么?

      创建一个新的迭代器。它很少比重置贵。

      【讨论】:

      • (除了有一个remove 方法,它并没有实际上真的给所有迭代器“额外的工作”,因为操作是可选的。)
      • @aioobe 在某些情况下,通过迭代器删除当前对象会使开发人员的工作变得非常轻松。很少有这种情况适用于重置(因为您几乎总是可以创建一个新的迭代器)。
      • @DJClayworth “这给了每个迭代器编写者额外的工作。”这不是一个合理的回应。库实现者需要做一些额外的努力,但回报是许多库用户将受益。
      • 更重要的一点是第二点,有些迭代器是无法重置的。
      • 如果迭代器是方法参数怎么办?如果我想将迭代器的更改传播给方法调用者......我不能,对吧?
      【解决方案4】:

      一旦您阅读了一个流,如果不再次打开源,您将无法重新阅读它。这就是流和迭代器的工作方式。

      【讨论】:

        【解决方案5】:

        最好的方法是创建一个新的!

        【讨论】:

        • 与您创建前一个的方式完全相同:Iterator iterator = iteratable.iterator();
        猜你喜欢
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 2018-08-13
        • 2013-09-14
        • 2011-09-13
        • 2011-06-21
        • 2015-10-10
        • 1970-01-01
        相关资源
        最近更新 更多