Scala - сокращение карты на основе измененного ключа

90
7

Допустим, у вас есть следующие данные карты

val testMap: Map[String, Int] = Map("AAA_abc" -> 1,
"AAA_anghesh" -> 2,
"BBB_wfejw" -> 3,
"BBB_qgqwe" -> 4,
"C_fkee" -> 5)

Теперь я хочу уменьшить карту с помощью key.split("_").head и добавить все значения для ключей, которые стали равными. Таким образом, для этого примера Map должна приводить к:

Map(AAA -> 3, BBB -> 7, C -> 5)

Каким будет правильный способ сделать это в Scala? Я пробовал конструкции с groupBy и reduceLeft но не смог найти решение.

спросил(а) 2017-11-14T16:22:00+03:00 2 года, 11 месяцев назад
1
Решение
60

Вот как это сделать:

testMap.groupBy(_._1.split("_").head).mapValues(_.values.sum)

ответил(а) 2017-11-14T16:31:00+03:00 2 года, 11 месяцев назад
59

Вариант за один проход:

testMap.foldLeft(Map[String,Int]())( (map, kv) => {
val key = kv._1.split("_").head
val previous = map.getOrElse(key,0)
map.updated(key, previous + kv._2) })

ответил(а) 2017-11-14T17:17:00+03:00 2 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема