Groupby数组[Array [String]] Scala

时间:2016-11-16 04:22:06

标签: arrays scala dictionary group-by

我有一个像这样的数组[Array [String]]:

Array(Array("A","1","2"), 
      Array("A","3","4"), 
      Array("A","5","6"),    
      Array("B","7","8"),
      Array("B","9","10"))

我想在每个子数组的第一个元素上进行分组,并获得这样的地图:

var A:Map[String, Array[String] = Map()
A + = ('A' -> Array("1", "2"))
A + = ('A' -> Array("3", "4"))
A + = ('A' -> Array("5", "6"))
A + = ('B' -> Array("7", "8"))
A + = ('B' -> Array("9", "10"))

我不知道如何操纵groupby来获得这个结果 你有什么想法吗?

1 个答案:

答案 0 :(得分:3)

试试这个。

val arr = Array(Array("A","1","2"),
                Array("A","3","4"),
                Array("A","5","6"),
                Array("B","7","8"),
                Array("B","9","10"))

val result = arr.groupBy(_.head).map{case (k,v) => k -> v.flatMap(_.tail)}

result("A")  // Array(1, 2, 3, 4, 5, 6)
result("B")  // Array(7, 8, 9, 10)

基本上,在分组后你需要删除每个子阵列的头部(即tail部分),你需要将子阵列展平成一个数组(即flatMap一部分)。

警告:如果任何子数组为空,这将抛出运行时异常。这是一个可以解决这个问题的版本。

val result=arr.groupBy(_.headOption).collect{case (Some(k),v)=>k->v.flatMap(_.tail)}