Digamos que tenemos los siguientes datos del mapa

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

Ahora quiero reducir el mapa en key.split("_").head y agregar todos los valores para las claves que se volvieron iguales. Entonces, para este ejemplo, Map debería resultar en:

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

¿Cuál sería la forma correcta de hacerlo en Scala? Probé construcciones con groupBy y reduceLeft pero no pude encontrar una solución.

0
Robin VdE 14 nov. 2017 a las 16:22

2 respuestas

La mejor respuesta

Aquí hay una manera de hacerlo:

testMap.groupBy(_._1.split("_").head).mapValues(_.values.sum)
1
Gabriele Petronella 14 nov. 2017 a las 15:05

Una variación en una pasada:

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) })
1
Chirlo 14 nov. 2017 a las 14:17