【发布时间】:2012-09-18 00:40:09
【问题描述】:
在 scala (2.9) 中转换列表的最佳方法是什么?
我有一个清单:
List[List[A]]
我想转换成的
List[A]
如何递归实现?或者有没有其他更好的方法?
【问题讨论】:
标签: scala list recursion flatten
在 scala (2.9) 中转换列表的最佳方法是什么?
我有一个清单:
List[List[A]]
我想转换成的
List[A]
如何递归实现?或者有没有其他更好的方法?
【问题讨论】:
标签: scala list recursion flatten
鉴于上述示例,我不确定您是否需要递归。看起来你想要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 有 flatten 方法。为什么不使用它?
List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
【讨论】:
List(1, List(2,3), 4, List(5,6,7)) 预期结果是List(1, 2, 3, 4, 5,6,7)
.flatten 显然是最简单的方法,但为了完整起见,您还应该了解 flatMap
val l = List(List(1, 2), List(3, 4))
println(l.flatMap(identity))
和理解等价物
println(for (list <- l; x <- list) yield x)
flatten 显然是 flatMap 的一个特例,它可以做的更多。
【讨论】:
listOfLists.flatMap(identity) 更改为 listOfLists.flatten。
你不需要递归,但你可以根据需要使用它:
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)
【讨论】:
如果你的结构可以进一步嵌套,比如:
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)
}
【讨论】:
如果你想使用平面地图,这里是方法
假设您有一个名为 ll 的 List[Int] 列表,并且您希望将其展平为 List, 很多人已经给你答案了,比如扁平化,这是最简单的方法。我假设您要求使用 flatmap 方法。如果是这样的话,这里是方法
ll.flatMap(_.map(o=>o))
【讨论】:
ll.flatMap(_) 也会和ll.flatMap(_.map(o=>o)) 做同样的事情吗?
_ => _ 也不起作用。