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] 类型,这意味着你被某种向下转换所困。跨度> IntArray[Int] 不同的类型,它们唯一的共同点是Any @TravisBrown 是的,有什么方法可以处理混合数组? 根据您要实现的目标,树形数据结构在这里可能更有用。然后要“压平”这棵树,你只需要遍历它。 @TravisBrown 非常感谢有见地的 cmets。谢谢! 【参考方案1】:

如果您将IntArray[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])

如果您不知道嵌套数组中有什么,可以将上面的 Ints 替换为 Any 并得到一个平坦的 Array[Any] 结果。 (编辑:Any 案例需要放在最后。)

(注意:这不是尾递归,因此如果您的数组嵌套非常深,它可能会溢出堆栈。)

【讨论】:

哇——我没有意识到编译器会用 case ai: Array[Int] => 做正确(错误)的事情。 非常感谢您的及时回复。 @TravisBrown - 数组在 JVM 中不是通用的。 @RexKerr:是的——它在语法上看起来很像即将给你警告的东西。

以上是关于Scala嵌套数组展平的主要内容,如果未能解决你的问题,请参考以下文章

Scala如何展平嵌套的地图[字符串,任何]

在pyspark中展平嵌套的json scala代码

展平任何嵌套的 json 字符串并使用 spark scala 转换为数据帧

展平嵌套数组。 (爪哇)

展平和取消展平 numpy 数组的嵌套列表

使用类型推断展平嵌套数组