我有一个嵌套数组:
Array("AA", Array("BB", "CC"), "DD")
。我怎样才能将其转换为:
Scala中的Array("AA", "BB", "CC", "DD")
?
感谢您的帮助!
答案 0 :(得分:2)
首先检查数组的推断类型:
scala> val arr = Array("AA", Array("BB", "CC"), "DD")
arr: Array[java.io.Serializable] = Array(AA, Array(BB, CC), DD)
Scala的集合对于它们的元素只有一种类型,所以如果你把一个字符串和一个字符串数组(或一个字符串数组的数组)放在一个数组中,你就会结束一个数组的元素类型是String
和Array[String]
共享的最具体的类型 - 在这种情况下Serializable
,这是非常无用的,因为要做任何事情数组的元素你必须将它们转换为其他类型。
因此,最好不要首先让自己陷入这种境地。如果您不在收藏品中混合不相关的东西,那么您将从类型系统中获得更多的里程数。也就是说,如果你必须这样做,你可以写下如下内容:
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)
但这些都是不安全的,而且非常不合时宜。
答案 1 :(得分:0)
array.flatMap {
case x: Array[_] => x
case y => List(y)
}
答案 2 :(得分:-1)
这是我的版本使用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)
答案 3 :(得分:-4)
循环遍历嵌套数组,并将任何嵌套数组中的所有元素添加到新的平面数组中。然后删除嵌套数组并追加新创建的数组。
对于您发布的示例。循环遍历数组,你会发现一个包含" BB"的嵌套数组。和" CC"所以添加" BB"和" CC"到一个新的数组(让我们称之为array2)。然后删除包含" BB"的数组。和" CC"来自原始的嵌套数组。然后追加array2。希望这有帮助