Функция подсчета количества раз Scala возвращает каждое значение функционально - PullRequest
0 голосов
/ 26 июня 2018

Я хочу подсчитать, сколько раз функция 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) - это количество раз, которое f возвращает n при применении к каждому элементу l. Это работает, однако, это императивный стиль, и мне интересно, есть ли чистый способ сделать это чисто функционально.

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

как насчет более общего подхода:

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)
0 голосов
/ 26 июня 2018
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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...