斯卡拉(2.9)中轉換列表列表的最佳方式是什麼?斯卡拉 - 將列表列表轉換爲一個列表:列表[列表[A]]列表[A]
我有一個列表:
List[List[A]]
,我想轉換成
List[A]
那怎麼可以遞歸實現?或者還有其他更好的方法嗎?
斯卡拉(2.9)中轉換列表列表的最佳方式是什麼?斯卡拉 - 將列表列表轉換爲一個列表:列表[列表[A]]列表[A]
我有一個列表:
List[List[A]]
,我想轉換成
List[A]
那怎麼可以遞歸實現?或者還有其他更好的方法嗎?
List has flatten method。爲什麼不使用它?
List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
鑑於上面的例子,我不確定你需要遞歸。看起來你想要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)
.flatten顯然是最簡單的方法,但對於完整性你也應該知道flatMap
val l = List(List(1, 2), List(3, 4))
println(l.flatMap(identity))
和換理解等同
println(for (list <- l; x <- list) yield x)
扁平化顯然是一個特例flatMap,可以做更多。
如果你想在地圖中添加一些數據,這是你想要的。 –
你不需要遞歸,但如果你願意,你可以使用它:
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)
如果您的結構可以進一步嵌套,如:
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)
}
您將如何拉平這個 '列表(1,列表(2,3),4,列表(5,6,7))' 預期結果是 'List(1,2,3,4,5,6,7)' –
上面的列表是異構的,扁平的不會在那裏工作。您可以執行如下操作: 列表(1,列表(2,3),4,列表(5,6,7))。collect {case i:Int => List(i); case l @ a :: b => l} .flatten – Jan