当要应用到给定列表{{1]时,我想计算一个函数f
返回其范围(0
至f_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
的次数。但是,这行之有效,这是必须的风格,我想知道是否有一种纯粹的方法可以在功能上做到这一点。
谢谢
答案 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
}