Scala集合上的高效分组聚合

Dan*_*ler 5 scala scala-collections

我经常需要做类似的事情

coll.groupBy(f(_)).mapValues(_.foldLeft(x)(g(_,_)))
Run Code Online (Sandbox Code Playgroud)

实现相同效果的最佳方法是什么,但避免使用groupBy?显式构建中间集合?

zig*_*tar 4

您可以将初始集合折叠在保存中间结果的地图上:

def groupFold[A,B,X](as: Iterable[A], f: A => B, init: X, g: (X,A) => X): Map[B,X] = 
  as.foldLeft(Map[B,X]().withDefaultValue(init)){
    case (m,a) => {
      val key = f(a)
      m.updated(key, g(m(key),a))
    }
  }
Run Code Online (Sandbox Code Playgroud)

你说的是 Collection ,我写的是Iterable,但你必须考虑问题中的折叠顺序是否重要。

如果您想要高效的代码,您可能会使用可变映射,如雷克斯的答案。