代码之家  ›  专栏  ›  技术社区  ›  Jon Deaton

Scala count函数返回每个值的次数

  •  0
  • Jon Deaton  · 技术社区  · 8 年前

    我想计算一个函数运行的次数 f 0 到 f_max ,包括)应用于给定列表时 l ,并以数组形式返回结果,单位为Scala。

    目前,我完成了以下工作:

     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) 那是多少倍 返回 n L . 不过,这是一种命令式风格,我想知道是否有一种纯粹从功能上做到这一点的干净方法。

    非常感谢。

    2 回复  |  直到 8 年前
        1
  •  1
  •   rad i    8 年前

    更一般的方法如何:

    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)
    
        2
  •  0
  •   Levi Ramsey    8 年前
    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
    }
    
    推荐文章