传递列表参数的空列表

时间:2013-10-12 02:50:51

标签: scala

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

1 个答案:

答案 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
  }
}
相关问题