Scala集合上的高效分组聚合

我经常需要做类似的事情

coll.groupBy(f(_)).mapValues(_.foldLeft(x)(g(_,_)))

实现相同效果的最佳方法是什么,但避免使用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))
    }
  }

你说收藏和我写了Iterable,但你必须考虑在你的问题中顺序是否重要.

如果你想要高效的代码,你可能会像在Rex的回答中那样使用可变映射.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...