【问题标题】:Writing generic takeWhile with an offset in Scala在 Scala 中使用偏移量编写通用 takeWhile
【发布时间】:2018-02-07 14:04:39
【问题描述】:

我有一个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 终止。有没有办法做到这一点?

【问题讨论】:

    标签: scala collections stream scala-collections lazy-sequences


    【解决方案1】:

    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)
    

    【讨论】:

    • 现在我觉得自己很笨,哈哈。冒着感觉更笨的风险,作为奖励,负偏移量呢?
    • 我知道你的意思。您也可以使用捕获的计数器 fold 或 takeWhile,但 span 非常有效。此外,如果这很重要,您必须测试懒惰。也就是说,这是完全懒惰的,你不必担心。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多