我有一个像这样的数组[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来获得这个结果 你有什么想法吗?
答案 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)}