如何在scala(2.9)中转换一个列表的列表?
我有一个列表:
List[List[A]]
我想要将其转换为什么。List[A]
怎么可以使用递归实现?或者有更好的方式吗?
List 有flatten方法,为什么不使用它?
List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
.flatten 显然是最简单的方法,但为了完整性,您也应该了解 flatMap
val l = List(List(1, 2), List(3, 4))
println(l.flatMap(identity))
以及for循环的等效表达式
println(for (list <- l; x <- list) yield x)
flatten显然是flatMap的一个特例,而flatMap可以做更多的事情。
listOfLists.flatMap(identity)
更改为listOfLists.flatten
。 - F. P. Freely根据上面的例子,我不确定您是否需要递归。看起来您想使用 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)
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)
}
你不需要使用递归,但如果你想用的话可以使用它:
def flatten[A](list: List[List[A]]):List[A] =
if (list.length==0) List[A]()
else list.head ++ flatten(list.tail)
这个方法就像内置在List中的flatten方法一样。例如:
scala> flatten(List(List(1,2), List(3,4)))
res0: List[Int] = List(1, 2, 3, 4)
ll.flatMap(_.map(o=>o))
ll.flatMap(_)
会不会和 ll.flatMap(_.map(o=>o))
做同样的事情? - akki_ => _
也不会起作用。 - srzhio
List(1, List(2,3), 4, List(5,6,7))
期望的结果是List(1, 2, 3, 4, 5, 6, 7)
- andres.santana