41

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

我有一个清单:

List[List[A]]

我想转换成

List[A]

如何递归实现?或者有没有其他更好的方法?

4

6 回答 6

57

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

List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
于 2012-09-26T12:05:54.100 回答
13

.flatten 显然是最简单的方法,但为了完整起见,您还应该了解 flatMap

 val l = List(List(1, 2), List(3, 4))
 println(l.flatMap(identity))

和理解等价物

 println(for (list <- l; x <- list) yield x)

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

于 2012-09-26T13:36:57.563 回答
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)
于 2012-09-26T11:40:47.890 回答
6

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

List(List(1, 2, 3, 4, List(5, 6, List(7, 8))))

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

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)
}
于 2018-01-16T17:54:38.827 回答
0

您不需要递归,但您可以根据需要使用它:

def flatten[A](list: List[List[A]]):List[A] = 
  if (list.length==0) List[A]() 
  else list.head ++ flatten(list.tail)

这就像 flatten 方法构建到 List 中一样。例子:

scala> flatten(List(List(1,2), List(3,4)))
res0: List[Int] = List(1, 2, 3, 4)
于 2016-10-22T11:03:43.640 回答
0

如果你想使用平面地图,这里是方式

假设你有一个名为 ll 的 List[Int] 列表,你想将它展平到 List,很多人已经给你答案了,比如展平,这很简单。我假设您要求使用 flatmap 方法。如果是这样,这就是方法

ll.flatMap(_.map(o=>o))
于 2018-03-05T21:59:55.457 回答