我有很大的Iterator,我想将它们分割成几部分。我有一个谓词来看一个项目,如果它是一个新片段的开始,则返回true。我需要这些片断作为迭代器,因为即使这些片断也不适合内存。有很多片断,我会警惕递归解决方案吹出你的堆栈。这种情况与this question类似,但我需要迭代器而不是列表,并且在一个片段的开头处出现(并且应该包括谓词)的“哨兵”(谓词为真的项目)。生成的迭代器只能按顺序使用,尽管有些可能完全不能使用,并且它们只应使用O(1)内存。我想这意味着他们应该都共享相同的基础迭代器。性能很重要。Scala:通过谓词将Iterable组合成一个Iterable Iterable
如果我拿在函数签名刺,这将是这样的:
def groupby[T](iter: Iterator[T])(startsGroup: T => Boolean): Iterator[Iterator[T]] = ...
我会喜欢使用takeWhile
,但它失去了最后一个元素。我调查了span
,但它缓冲了结果。我目前最好的想法涉及BufferedIterator
,但也许有更好的方法。
你会知道你有它正确的,因为这样的事情不会崩溃您的JVM:
groupby((1 to Int.MaxValue).iterator)(_ % (Int.MaxValue/2) == 0).foreach(group => println(group.sum))
groupby((1 to Int.MaxValue).iterator)(_ % 10 == 0).foreach(group => println(group.sum))
见http://stackoverflow.com/questions/5410846/how-do-i-apply-the-pimp-my-library-pattern-to-scala-collections/5411133#5411133 – huynhjl