我参与了“Scala中的功能编程原理”中的“包函数”练习。
将连续重复项放入
List[List[T]]
。
实施例
input: List("a", "a", "b", "b", "c", "a")
output: List(List(a, a), List(b, b), List(c), List(a))
鉴于此功能......
def pack[T](xs: List[T]): List[List[T]] = {
def go[T](ys: List[T], acc: List[List[T]]) : List[List[T]] = ys match {
case Nil => acc
case x :: xs_ => val r: List[T] = ys.takeWhile(a => a == x)
go(ys.drop(r.length), acc :+ r)
}
go(xs, List(Nil).filter(_ != Nil)) // *** line in question ***
}
是否有更好的方法来传入内部列表为空的List[List[T]]
?
如果我没有filter
,那么pack(...)
的结果就是List()
。
答案 0 :(得分:2)
为什么不............
go(xs, Nil)
顺便说一下,我有解决这个问题的方法:
def pack[T](xs: List[T],
acc: List[List[T]] = Nil): List[List[T]] =
(xs, acc) match {
case (Nil, _) => acc
case (i:+last, (h::t1)::t2) if last == h => pack(i, (last::h::t1)::t2)
case (i:+last, acc0) => pack(i, List(last)::acc0)
}
这是另一种解决方案:
def pack[T](xs: List[T]): List[List[T]] = xs match {
case Nil => Nil
case x::rs => pack(rs) match {
case (h@`x`::_)::t => (x::h)::t
case t => List(x)::t
}
}