1

我参与了“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().

4

1 回答 1

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
  }
}
于 2013-10-12T03:26:27.887 回答