2

私はtakeWhileのユースケースを持っていますが、述語がtrueの後は固定数のアイテムを保持したいところです。私はまた、コレクションのタイプに対してできるだけジェネリックであるように記述しようとしています。だから、のようなもの:それはStreamで動作するようにしたいので、スカラにオフセット付きジェネリックtakeWhileを書く

def takeWhileWithOffset[A, Iter[_] <: Iterable[A]](iter: Iter[A], p: A => Boolean, offset: Int) 

私は、バウンドとしてIterableを選びました。しかし、私はこの作業をどうやって行うかを考え出すのに苦労しています。厳密なコレクションを使用していた場合、オフセットが正でない場合はdropRightを使用できます。しかしIterableにはdropRightがありません。

陽性のケースはトリッキーです。私はslidingを使って、将来のアイテムを効果的につかみ、takeWhile終了後にinitlastOptionを使用することができました。しかしIterableinitlastOptionを持っていません。

それでは、トリッキーなのは、私は私の方法は怠惰になりたい、まだアイテムが厳しいコレクションとして扱うことができ、反復事実を利用することである - しかし場合のみtakeWhile終了。これを行う方法はありますか?

答えて

4

spantake

scala> val it = (1 to 100).iterator 
it: Iterator[Int] = non-empty iterator        

scala> val (a, b) = it.span(_ < 10) 
a: Iterator[Int] = non-empty iterator 
b: Iterator[Int] = unknown-if-empty iterator 

scala> val res = a ++ b.take(5) 
res: Iterator[Int] = non-empty iterator 

scala> res.toList 
res0: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) 
+0

今、私はハハ、ダム感じます。ダンベルを感じるリスク、ボーナスとして負のオフセットはどうですか? – acjay

+1

私はあなたのことを知っています。キャプチャされたカウンターで折ることも、持ち帰ることもできますが、スパンはかなり飛びます。また、怠惰があるかどうかテストする必要があります。つまり、これは完全に怠惰であり、心配する必要はありません。 –

関連する問題