我尝试使用以下代码展平列表列表。当我把它写在纸上,它应该工作,但我想我误解或不知道列表如何工作。谁能告诉我哪里出错了。
val a = List(List(1,2,3),List(4,5,6),List(7,8,9))
def flatten(xss : List[List[Any]]) : List[Any] = {
def flat(xs : List[Any]) : List[Any] = xs match {
case Nil => Nil
case head :: Nil=> head :: Nil
case head :: tail => head :: flat(tail)
}
xss match {
case Nil => Nil
case head :: Nil => flat(head)
case head :: tail => flat(head) :: flatten(tail)
}
}
flatten(a)
答案 0 :(得分:1)
您的flat
函数只是重新创建其参数列表,因此可以将其删除。
您只需使用:::
:
def flatten(xss : List[List[_]]): List[Any] = xss match {
case Nil => Nil
case head :: tail => head ::: flatten(tail)
}
答案 1 :(得分:1)
我对您的示例进行了两处小修改,以使其正常工作。第一个是使用泛型(不是问题,但稍微清除了代码)。第二种是在输入列表包含多个项目的情况下使用:::
而不是::
。 ::
方法将单个项目添加到List中,List是列表中项目的类型。 :::
将两个列表连接在一起。使用List[Any]
类型,您无法看到该问题。但是,一旦我将类型更改为T
,问题就明确在哪里了。
def flatten[T](xss : List[List[T]]) : List[T] = {
def flat(xs : List[T]) : List[T] = xs match {
case Nil => Nil
case head :: Nil=> head :: Nil
case head :: tail => head :: flat(tail)
}
xss match {
case Nil => Nil
case head :: Nil => flat(head)
case head :: tail => flat(head) ::: flatten(tail)
}
}
答案 2 :(得分:0)
您实际上可以将模式匹配深入到结构中:
def flatten[T](xss: List[List[T]]): List[T] = xss match {
case Nil => Nil
case Nil :: tail => flatten(tail)
case (innerHead :: innerTail) :: tail => innerHead :: flatten(innerTail :: tail)
}