Scala - 将列表列表转换为单个列表:列出[列表[A]]到列表[A]

A F*_*Far 36 recursion scala list flatten

在scala(2.9)中转换列表列表的最佳方法是什么?

我有一个清单:

List[List[A]]
Run Code Online (Sandbox Code Playgroud)

我要转换成

List[A]
Run Code Online (Sandbox Code Playgroud)

如何以递归方式实现?或者还有其他更好的方法吗?

Jan*_*Jan 50

List有flatten方法.为什么不用它?

List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

  • 你将如何展平这个 `List(1, List(2,3), 4, List(5,6,7))` 预期结果是 `List(1, 2, 3, 4, 5,6,7)` (2认同)
  • 以上列表是异构的,扁平化不会在那里工作.您可以执行以下操作:List(1,List(2,3),4,List(5,6,7)).collect {case i:Int => List(i); case l @ a :: b => l} .flatten (2认同)

Bri*_*new 10

鉴于上面的例子,我不确定你需要递归.看起来你想要的List.flatten.

例如

scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)

scala> List(4,5,6)
res1: List[Int] = List(4, 5, 6)

scala> List(res0,res1)
res2: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6)) 

scala> res2.flatten
res3: List[Int] = List(1, 2, 3, 4, 5, 6)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ith 10

.flatten显然是最简单的方法,但为了完整,你也应该了解flatMap

 val l = List(List(1, 2), List(3, 4))
 println(l.flatMap(identity))
Run Code Online (Sandbox Code Playgroud)

和理解相当

 println(for (list <- l; x <- list) yield x)
Run Code Online (Sandbox Code Playgroud)

flatten显然是flatMap的一个特例,它可以做得更多.


Mar*_*oun 6

如果您的结构可以进一步嵌套,例如:

List(List(1, 2, 3, 4, List(5, 6, List(7, 8))))
Run Code Online (Sandbox Code Playgroud)

这个函数应该给你想要的结果:

def f[U](l: List[U]): List[U] = l match {
  case Nil => Nil
  case (x: List[U]) :: tail => f(x) ::: f(tail)
  case x :: tail => x :: f(tail)
}
Run Code Online (Sandbox Code Playgroud)