2017-08-30 72 views
2

我有一個takeWhile的用例,但是我希望在謂詞爲true後保留固定數量的項目。我也試圖把它寫成儘可能通用的類型的集合。因此,像:在Scala中編寫帶有偏移量的通用takeWhile

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

我選擇Iterable爲界,是因爲希望它與Stream工作。但是我很難搞清楚如何做這個工作。如果我使用的是嚴格收集,如果偏移量不是正數,我可以使用dropRight。但是Iterable沒有dropRight

正面的情況更棘手。我可以使用sliding來有效抓取未來物品,然後在takeWhile終止後使用initlastOption。但是Iterable沒有initlastOption

那麼,什麼是棘手的是,我希望我的方法偷懶,但採取的是迭代的項目可以作爲一個嚴格的收集要處理的事實的優點 - 但只有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

我知道你的意思。你也可以用一個捕捉的計數器摺疊或拍攝,但是跨度很大。另外,如果這很重要,你必須測試懶惰。也就是說,這是完全懶惰的,你不必擔心。 –