我有一个嵌套数组:
谢谢您的帮助!
Array("AA", Array("BB", "CC"), "DD")
。我该如何在Scala中将其转换为:Array("AA", "BB", "CC", "DD")
?谢谢您的帮助!
Array("AA", Array("BB", "CC"), "DD")
。我该如何在Scala中将其转换为:Array("AA", "BB", "CC", "DD")
?首先检查数组的推断类型:
scala> val arr = Array("AA", Array("BB", "CC"), "DD")
arr: Array[java.io.Serializable] = Array(AA, Array(BB, CC), DD)
def flattenStringArrays[A](arr: Array[A]): Array[String] =
arr.flatMap {
case s: String => Array(s)
case a: Array[_] => flattenStringArrays(a)
}
然后:
scala> flattenStringArrays(arr)
res0: Array[String] = Array(AA, BB, CC, DD)
或者如果您“知道”您只会有一个嵌套层级:
scala> arr.flatMap {
| case s: String => Array(s)
| case a: Array[String] => a
| }
res1: Array[String] = Array(AA, BB, CC, DD)
array.flatMap {
case x: Array[_] => x
case y => List(y)
}
List
和Array
的困惑)。 - Travis BrownList
的。 - Matias Saarinen以下是使用foldLeft和一些模式匹配的版本:(它不保留原始顺序)
$ scala
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val container = Array("AA", Array("BB", "CC"), "DD")
container: Array[java.io.Serializable] = Array(AA, Array(BB, CC), DD)
scala> container.foldLeft(Array.empty[String]) { (memo, next) =>
| next match {
| case s: String => s +: memo
| case arr: Array[_] => arr.map(_.toString) ++ memo
| }
| }
res0: Array[String] = Array(DD, BB, CC, AA)