Как да преобразувам списък с цели числа в карта с честота на контейнер?

Да приемем, че имам списък с числа:

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

Как мога да преброя броя на целите числа на bin на 100, за да получа:

Map(0 -> 2, 100 -> 3, 200 -> 1)

person WillamS    schedule 07.12.2013    source източник


Отговори (1)


Започвайки от Scala 2.13, можете да използвате groupMapReduce метод, който е (както подсказва името му) еквивалент на groupBy, последвано от map и reduce стъпка на стойности:

// val items = List(1, 2, 3, 101, 330, 302)
items.groupMapReduce(_ / 100 * 100)(_ => 1)(_ + _)
// Map(0 -> 3, 100 -> 1, 300 -> 2)

Това:

  • groups елемента по свързания им "кош" (_ / 100 * 100 напр. 330 / 100 * 100 = 300) (част от групата на групатаMapReduce)

  • maps групирани стойности до 1 (_ => 1) (карта част от групатаКартаНамаляване)

  • reduces стойности във всяка група (_ + _), като ги сумирате (намалете част от groupMapReduce).

Това е един -pass версия на това, което може да се преведе от:

items.groupBy(_ / 100 * 100).mapValues(_.map(_ => 1).reduce(_ + _)).toMap
person Xavier Guihot    schedule 08.06.2019