2012-09-26 145 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

相關問題