【发布时间】:2011-12-03 02:33:59
【问题描述】:
为什么?以及将迭代器项指针移动到第一个位置的最佳方法是什么?
【问题讨论】:
标签: java collections iterator
为什么?以及将迭代器项指针移动到第一个位置的最佳方法是什么?
【问题讨论】:
标签: java collections iterator
提示:改为将迭代器变量创建为函数,然后您可以根据需要多次使用它。这仅适用于底层逻辑可重复的情况。
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
【讨论】:
这是 JCF 采用的普遍趋势 - 保持界面简约,除非这会使某些功能极难使用。这就是为什么你没有单独的语义接口的原因,比如不可变集合、固定大小的集合..
至于为什么提供remove(Object)(作为可选) - 不提供这将导致在迭代集合时无法安全地从集合中删除项目 - 没有什么可以提供reset() 所以强制。
再次,为什么有一个单独的ListIterator()(提供previous() 和previousIndex() 之类的方法) - 使用List 接口,使用它时的主要功能是能够对元素进行布局index,并能够使用 index-order 访问它们,无论是固定顺序还是随机顺序。其他集合则不是这种情况。不为List 提供此接口将使得即使不是不可能顺利使用列表也非常困难。
【讨论】:
Iteratable 和Iterator 都可以完成一些事情,这些事情本来可以有用地包含在界面中,但没有。有用的迭代器方法将包括 skip [相当于 N 个连续的移动调用,尽管许多迭代器可以在 O(1) 时间内实现它] 和 copyLocation [这将返回一个迭代器,该迭代器预计会产生与原始相同的项目]。任何迭代器都可以实现skip 方法,并且任何非巨大的有限迭代器都可以通过将自身枚举到一个数组中来实现copyLocation,然后将它和副本都...
为什么?
因为如果你强制迭代器有一个重置方法每个迭代器必须有一个重置方法。这给了每个迭代器编写者额外的工作。另外,有些迭代器真的很难(或真的很昂贵)重置,而且你不希望用户对它们调用重置。文件或流上的迭代器就是很好的例子。
将迭代器项指针移动到第一个位置的最佳方法是什么?
创建一个新的迭代器。它很少比重置贵。
【讨论】:
remove 方法,它并没有实际上真的给所有迭代器“额外的工作”,因为操作是可选的。)
一旦您阅读了一个流,如果不再次打开源,您将无法重新阅读它。这就是流和迭代器的工作方式。
【讨论】:
最好的方法是创建一个新的!
【讨论】: