如何将嵌套数组转换为平面数组?

时间:2015-06-03 22:00:55

标签: arrays scala

我有一个嵌套数组: Array("AA", Array("BB", "CC"), "DD")。我怎样才能将其转换为: Scala中的Array("AA", "BB", "CC", "DD")

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

首先检查数组的推断类型:

scala> val arr = Array("AA", Array("BB", "CC"), "DD")
arr: Array[java.io.Serializable] = Array(AA, Array(BB, CC), DD)

Scala的集合对于它们的元素只有一种类型,所以如果你把一个字符串和一个字符串数组(或一个字符串数组的数组)放在一个数组中,你就会结束一个数组的元素类型是StringArray[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。希望这有帮助