Scala函数功能返回每个值的次数

时间:2018-06-26 18:10:51

标签: scala functional-programming

当要应用到给定列表{{1]时,我想计算一个函数f返回其范围(0f_max(包括两端))中的每个值的次数}},并在Scala中以数组形式返回结果。

当前,我完成以下任务:

l

因此 def count (l: List): Array[Int] = { val arr = new Array[Int](f_max + 1) l.foreach { el => arr(f(el)) += 1 } return arr } arr(n)应用于f的每个元素时返回n的次数。但是,这行之有效,这是必须的风格,我想知道是否有一种纯粹的方法可以在功能上做到这一点。

谢谢

2 个答案:

答案 0 :(得分:1)

一种更通用的方法:

def count[InType, ResultType](l: Seq[InType], f: InType => ResultType): Map[ResultType, Int] = {
  l.view                              // create a view so we don't create new collections after each step
    .map(f)                           // apply your function to every item in the original sequence
    .groupBy(x => x)                  // group the returned values
    .map(x => x._1 -> x._2.size)      // count returned values
}

val f = (i:Int) => i
count(Seq(1,2,3,4,5,6,6,6,4,2), f)

答案 1 :(得分:0)

l.foldLeft(Vector.fill(f_max + 1)(0)) { (acc, el) =>
  val result = f(el)
  acc.updated(result, acc(result) + 1)
}

或者,性能和外部纯度之间的良好平衡是:

def count(l: List[???]): Vector[Int] = {
  val arr = l.foldLeft(Array.fill(f_max + 1)(0)) { (acc, el) =>
    val result = f(el)
    acc(result) += 1
  }
  arr.toVector
}