在(Skey)的Seq上Scala groupby键总和值保持顺序

irr*_*ser 5 collections scala

我正在尝试解决对scala元组进行分组和求和并维护键顺序的问题。

说,

val arrayTuples = Array((A, 38) , (B, 150), (B, 250), (B, 890), (D, 600), (C, 515))
Run Code Online (Sandbox Code Playgroud)

Map(A -> 38, B -> 1290, D -> 600, C -> 515)
Run Code Online (Sandbox Code Playgroud)

正在做:

val aMap = arrayTuples .groupBy(_._1)
Run Code Online (Sandbox Code Playgroud)

似乎搞乱了订购。帮助表示赞赏。

编辑:维护第一次遇到的顺序。

jwv*_*wvh 5

您可以使用ListMap保留订单,但是如果您希望按照注释中的说明从左至右进行排序,则需要一些额外的步骤。

//note the new order of elements
val arrayTuples =
  Array(('A', 38), ('B', 150), ('D', 600), ('B', 250), ('C', 515), ('B', 890))

import collection.immutable.ListMap

arrayTuples.foldRight(ListMap[Char,Int]()) {
  case ((c,n), lm) => lm.updated(c , lm.getOrElse(c, 0)+n)
}.foldRight(ListMap[Char,Int]()){case (elem,lm) => lm+elem}
//res0: ListMap[Char,Int] = ListMap(A -> 38, B -> 1290, D -> 600, C -> 515)
Run Code Online (Sandbox Code Playgroud)

因为ListMap保留了上一个最后一次执行的顺序(在这种情况下会将B条目移到末尾),所以我决定执行foldRight,将A条目移到末尾,然后foldRight再次将整个过程反转。