如何将整数列表转换为scala中每个bin的频率的映射

时间:2013-12-07 14:34:02

标签: scala scala-collections

假设我在Scala中有一个数字列表。

val numbers = List(15,30,110,140,170,210)

计算每个bin的整数个数的最佳方法是什么。

因此,对于上面的列表,结果将是以下地图:

0 -> 2
100 -> 3
200 -> 1

2 个答案:

答案 0 :(得分:6)

scala> List(1,2,3,101,330,302).groupBy(i => i/100)
                              .map {case (i,l) => (i*100,l.length)}
res1: scala.collection.immutable.Map[Int,Int] = Map(100 -> 1, 300 -> 2, 0 -> 3)

答案 1 :(得分:1)

Scala 2.13开始,您可以使用groupMapReduce方法,该方法(如其名称所示)等效于groupBy,后跟map和{{1 }}运用价值:

reduce

此:

  • // val items = List(1, 2, 3, 101, 330, 302) items.groupMapReduce(_ / 100 * 100)(_ => 1)(_ + _) // Map(0 -> 3, 100 -> 1, 300 -> 2) 项通过其关联的“ bin”(group例如_ / 100 * 100)( MapReduce的组部分)

  • 330 / 100 * 100 = 300将值分组为1(map)(映射组 Map Reduce)

  • 通过对每个组(_ => 1)中的值
  • reduce进行求和(减少groupMap Reduce 的一部分)。

这是one-pass version可以翻译的内容:

_ + _