/ / Sommare e raggruppare i valori delle mappe in Scala: scala, dizionario, raccolte, raggruppamento, aggregazione

Sommare e raggruppare i valori delle mappe in Scala - scala, dizionario, raccolte, raggruppamento, aggregazione

Sono un novizio di Scala e sto cercando un modo più conciso per sommare e raggruppare i valori delle mappe. Esiste un modo migliore rispetto al seguente codice:

def mapSum(thisMap: Map[Char, Int], thatMap: Map[Char, Int]) = {
thisMap.transform { (k, v) => thatMap(k) + v }
}

Che soddisferebbe il seguente test:

@Test
def mapSum() {
val map: Map[Char, Int] = Map("C" -> 1, "D" -> 3)
val newMap = mapSum(map, map)
assertEquals(2, newMap("C"))
assertEquals(6, newMap("D"))
}

risposte:

3 per risposta № 1

Se stai per succedere, non otterrai molto meglio della tua versione attuale con la libreria standard (anche se nota che puoi rilasciare le parentesi esterne per renderla a due righe).

Scalaz fornisce alcuni strumenti che possono rendere questo tipo di cose un po 'più conciso, inclusa un'istanza monoid per Map e un magnaccia unionWith metodo:

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> val m = Map("C" -> 1, "D" -> 3)
m: scala.collection.immutable.Map[Char,Int] = Map(C -> 1, D -> 3)

scala> m |+| m
res0: scala.collection.immutable.Map[Char,Int] = Map(C -> 2, D -> 6)

scala> (m unionWith m)(_ + _)
res1: Map[Char,Int] = Map(C -> 2, D -> 6)

Si noti che entrambi questi approcci si comportano aleggermente diverso dal tuo, però: non si strozzano durante l'esecuzione se ci sono chiavi nel primo che non sono nel secondo, e non ignorano silenziosamente i tasti nel secondo che non sono nel primo.