我看到 Scala 标准库缺少获取集合中满足谓词的对象范围的方法:
def <???>(p: A => Boolean): List[List[A]] = {
val buf = collection.mutable.ListBuffer[List[A]]()
var elems = this.dropWhile(e => !p(e))
while (elems.nonEmpty) {
buf += elems.takeWhile(p)
elems = elems.dropWhile(e => !p(e))
}
buf.toList
}
这种方法的好名字是什么?我的实现是否足够好?
最佳答案
我会选择 chunkWith 或 chunkBy
至于您的实现,我认为这需要递归!看看你能不能填这个
@tailrec def chunkBy[A](l: List[A], acc: List[List[A]] = Nil)(p: A => Boolean): List[List[A]] = l match {
case Nil => acc
case l =>
val next = l dropWhile !p
val (chunk, rest) = next span p
chunkBy(rest, chunk :: acc)(p)
}
为什么要递归?它更容易理解算法并且更有可能没有错误(假设没有变量)。
谓词否定的语法 !p 是通过隐式转换实现的
implicit def PredicateW[A](p: A => Boolean) = new {
def unary_! : A => Boolean = a => !p(a)
}
我通常会保留它,因为它非常有用
关于scala - 这个操作的好名字是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13005153/