非常に大きなIteratorを分割して分割したい。私はアイテムを見て、新しいピースの始まりであれば真を返す述語を持っています。私は作品をイテレーターにする必要があります。なぜなら作品も記憶に収まらないからです。あなたのスタックを吹き飛ばす再帰的な解決策が気になるほど多くの部分があります。状況は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