/ / Sumarizácia a zoskupovanie hodnôt mapy v Scale - Scala, slovník, zbierky, zoskupovanie, agregácia

Sumarizácia a zoskupovanie hodnôt máp v Scale - scala, slovník, zbierky, zoskupovanie, agregácia

Ja som nováčik v Scale a ja hľadám stručnejší spôsob, ako zhrnúť a zoskupiť hodnoty mapy. Existuje lepší spôsob ako nasledujúci kód:

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

Ktorý by spĺňal nasledujúci 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"))
}

odpovede:

3 pre odpoveď č. 1

Ak ste "ísť na stručné, vy" nebudete sa dostať oveľa lepšie, než je vaša aktuálna verzia so štandardnou knižnicou (aj keď si všimnite, že môžete drop vonkajšie závorky, aby to dva-liner).

Scalaz poskytuje niektoré nástroje, ktoré môžu urobiť tento druh veci trochu stručnejší, vrátane inštancie monoid pre Map a pasák unionWith metóda:

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)

Všimnite si, že obidva tieto prístupy sa správajúTrochu inak, ako je vaša, aj keď - v čase behu sa nedajú udusiť, ak sú kľúče v prvom, ktoré nie sú v druhom, a nevedia ticho ignorovať kľúče v druhom, ktoré nie sú v prvej.