Dan*_*ler 5 scala scala-collections
我经常需要做类似的事情
coll.groupBy(f(_)).mapValues(_.foldLeft(x)(g(_,_)))
Run Code Online (Sandbox Code Playgroud)
实现相同效果的最佳方法是什么,但避免使用groupBy?显式构建中间集合?
您可以将初始集合折叠在保存中间结果的地图上:
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,但你必须考虑问题中的折叠顺序是否重要。
如果您想要高效的代码,您可能会使用可变映射,如雷克斯的答案。