2017-11-14 6 views
0

Können sagen, haben die folgenden KartendatenScala - eine Karte zu reduzieren, basierend auf geänderten Schlüssel

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

Jetzt habe ich die Karte von key.split("_").head reduzieren möchten und alle Werte für die Schlüssel hinzufügen, die gleich wurde. So für dieses Beispiel sollte die Map resultieren in:

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

Was ist der richtige Weg wäre so in Scala zu tun? Ich versuchte Konstruktionen mit groupBy und reduceLeft, konnte aber keine Lösung finden.

+0

u kann zeigen, was Code haben u versucht? –

Antwort

1

Hier ist ein Weg, es zu tun:

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

Vielen Dank! Genau das brauche ich. –

+0

Sie könnten 'mapValues ​​(_. Values.sum)' statt – Chirlo

+0

Richtig, danke. Aktualisiert –

1

Eine Variation in einem Durchgang:

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) }) 
Verwandte Themen