Scala嵌套数组展平
Posted
技术标签:
【中文标题】Scala嵌套数组展平【英文标题】:Scala nested arrays flattening 【发布时间】:2014-05-28 03:44:11 【问题描述】:如何展平任意深度的嵌套数组?
例如
val in = Array( 1, Array(2,3), 4, Array(Array(5)) )
会被压扁
val out = Array(1,2,3,4,5)
提前致谢。
【问题讨论】:
在一个集合中混合不同类型的值通常是个坏主意——你的in
只能有Array[Any]
类型,这意味着你被某种向下转换所困。跨度>
Int
和Array[Int]
是不同的类型,它们唯一的共同点是Any
。
@TravisBrown 是的,有什么方法可以处理混合数组?
根据您要实现的目标,树形数据结构在这里可能更有用。然后要“压平”这棵树,你只需要遍历它。
@TravisBrown 非常感谢有见地的 cmets。谢谢!
【参考方案1】:
如果您将Int
和Array[Int]
混合使用,这不是一个好主意,您可以这样做
in.flatMap case i: Int => Array(i); case ai: Array[Int] => ai
(如果您在数组中添加了其他内容,它将引发异常)。因此,您可以将其用作递归函数的基础:
def flatInt(in: Array[Any]): Array[Int] = in.flatMap
case i: Int => Array(i)
case ai: Array[Int] => ai
case x: Array[_] => flatInt(x.toArray[Any])
如果您不知道嵌套数组中有什么,可以将上面的 Int
s 替换为 Any
并得到一个平坦的 Array[Any]
结果。 (编辑:Any
案例需要放在最后。)
(注意:这不是尾递归,因此如果您的数组嵌套非常深,它可能会溢出堆栈。)
【讨论】:
哇——我没有意识到编译器会用case ai: Array[Int] =>
做正确(错误)的事情。
非常感谢您的及时回复。
@TravisBrown - 数组在 JVM 中不是通用的。
@RexKerr:是的——它在语法上看起来很像即将给你警告的东西。以上是关于Scala嵌套数组展平的主要内容,如果未能解决你的问题,请参考以下文章