Scala嵌套数组展开

4
如何将任意深度的嵌套数组展开?
例如:
val in = Array( 1, Array(2,3), 4, Array(Array(5)) )

会被压缩到同一层级上。
val out = Array(1,2,3,4,5)

感谢您提前的支持。

在集合中混合不同类型的值通常是一个不好的主意——你的in可能只有类型为Array[Any],这意味着你必须进行某种形式的下转换。 - Travis Brown
1
IntArray[Int] 是不同的类型,它们唯一共同拥有的类型是 Any - Travis Brown
@TravisBrown 确实,对于一个混乱的数组,可能有什么方法? - elm
1
根据您想要实现的目标,树形数据结构可能更有用。然后,要“展平”树,您只需要遍历它。 - Chris B
@TravisBrown 非常感谢您的深入评论。谢谢! - elm
1个回答

9
如果您混合使用 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])
}

如果你不知道嵌套数组中的内容,可以将上述的Int替换为Any并得到一个扁平的Array[Any]作为结果。(编辑:此时Any的情况需要放在最后。)
(注意:这不是尾递归,如果你的数组嵌套极深,它可能会溢出堆栈。)

哇——我没想到编译器会对 case ai: Array[Int] => 做出正确(错误)的处理。 - Travis Brown
非常感谢您的及时回复。 - elm
@TravisBrown - 在JVM中,数组不是泛型。 - Rex Kerr
@RexKerr:没错——它的语法看起来就像是即将让你收到警告的东西。 - Travis Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接