使用展平方法展平Scala中的列表列表,但结果不佳

时间:2015-04-22 15:48:56

标签: list scala scala-collections flatten

我尝试使用以下代码展平列表列表。当我把它写在纸上,它应该工作,但我想我误解或不知道列表如何工作。谁能告诉我哪里出错了。

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)

3 个答案:

答案 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)
}