2012-09-26 147 views

回答

41

List has flatten method。为什么不使用它?

List(List(1,2), List(3,4)).flatten 
> List(1,2,3,4) 
+1

您将如何拉平这个 '列表(1,列表(2,3),4,列表(5,6,7))' 预期结果是 'List(1,2,3,4,5,6,7)' –

+2

上面的列表是异构的,扁平的不会在那里工作。您可以执行如下操作: 列表(1,列表(2,3),4,列表(5,6,7))。collect {case i:Int => List(i); case l @ a :: b => l} .flatten – Jan

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) 
10

.flatten显然是最简单的方法,但对于完整性你也应该知道flatMap

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

和换理解等同

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

扁平化显然是一个特例flatMap,可以做更多。

+0

如果你想在地图中添加一些数据,这是你想要的。 –

0

你不需要递归,但如果你愿意,你可以使用它:

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

这就像扁平化方法建成名单。例如:

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

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

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) 
} 
0

如果你想使用flatmap,这里是方式

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

ll.flatMap(_.map(o=>o)) 
+0

这个答案与5年前Dave Griffith给出的答案有何不同?(除了旧的答案更清晰和更简洁的事实。) – jwvh

+0

你说得对,几乎一样。我相信我的理解更容易,或者给你的下划线带来一些冲击。我传递身份函数而不是身份关键字。希望它对你有意义 – Robin

相关问题