【问题标题】:Scala nested arrays flatteningScala嵌套数组展平
【发布时间】: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。谢谢!

标签: arrays scala collections flatten


【解决方案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:是的——它在语法上看起来很像即将给你警告的东西。
猜你喜欢
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2019-08-11
  • 2012-10-31
  • 2017-03-06
  • 2017-07-20
相关资源
最近更新 更多