Да приемем, че имам списък с числа:
val numbers = List(15, 30, 110, 140, 170, 210)
Как мога да преброя броя на целите числа на bin на 100
, за да получа:
Map(0 -> 2, 100 -> 3, 200 -> 1)
Да приемем, че имам списък с числа:
val numbers = List(15, 30, 110, 140, 170, 210)
Как мога да преброя броя на целите числа на bin на 100
, за да получа:
Map(0 -> 2, 100 -> 3, 200 -> 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)
Това:
group
s елемента по свързания им "кош" (_ / 100 * 100
напр. 330 / 100 * 100 = 300
) (част от групата на групатаMapReduce)
map
s групирани стойности до 1 (_ => 1
) (карта част от групатаКартаНамаляване)
reduce
s стойности във всяка група (_ + _
), като ги сумирате (намалете част от groupMapReduce).
Това е един -pass версия на това, което може да се преведе от:
items.groupBy(_ / 100 * 100).mapValues(_.map(_ => 1).reduce(_ + _)).toMap