在scala(2.9)中转换列表列表的最佳方法是什么?
我有一个清单:
List[List[A]]
我想转换成
List[A]
如何以递归方式实现?或者还有其他更好的方法吗?
答案 0 :(得分:47)
列表具有展平方法。为什么不使用它?
List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
答案 1 :(得分:10)
鉴于上面的例子,我不确定你需要递归。看起来你想要List.flatten
。
e.g。
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)
答案 2 :(得分:10)
.flatten显然是最简单的方法,但为了完整性你还应该了解flatMap
val l = List(List(1, 2), List(3, 4))
println(l.flatMap(identity))
和for-comprehension等价物
println(for (list <- l; x <- list) yield x)
flatten显然是flatMap的一个特例,它可以做得更多。
答案 3 :(得分:4)
如果您的结构可以进一步嵌套,例如:
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)
}
答案 4 :(得分: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)
答案 5 :(得分:0)
如果你想使用flatmap,这就是方法
假设您有一个名为ll的List [Int]列表,并且您希望将其平展为List, 许多人已经给你答案,例如flatten,这是简单的方法。我假设您要求使用flatmap方法。如果是这种情况,这就是方式
ll.flatMap(_.map(o=>o))