Fusionar dos maps en Scala y luego sumar los valores con la misma clave
-
Fusionando dos maps en Scala usando el operador
++
- Combinar maps y sumar los valores con la misma clave
Veremos cómo los Maps
se fusionan usando ++
en Scala, y luego, veremos diferentes formas de fusionar y sumar los valores con la misma clave con el método modificado ++
y fusionado
disponible con Mapa hash.
Fusionando dos maps en Scala usando el operador ++
Sintaxis:
map1.++(map2)
Aquí map2 se fusiona con map1, y el map
resultante se devuelve como salida. ++
fusiona los maps, pero elimina los duplicados; el último par clave, valor
se considera cada vez que se produce un conflicto entre las claves.
Código de ejemplo:
object Main {
def main(args: Array[String])
{
//let's assume a mapping from Student -> marks
val map1_english = Map("Tony" -> 50, "Ruby" -> 89)
val map2_maths = Map("Tony"->77,"Ruth" -> 100, "Ben" -> 78)
println("Map1 : " + map1_english)
println("Map2 : " + map2_maths)
// merging the map
val mergedMap = map1_english.++(map2_maths)
println("Class marks are : " + mergedMap)
}
}
Producción :
Map1 : Map(Tony -> 50, Ruby -> 89)
Map2 : Map(Tony -> 77, Ruth -> 100, Ben -> 78)
Class marks are : Map(Tony -> 77, Ruby -> 89, Ruth -> 100, Ben -> 78)
Se puede observar que el último par clave, valor
, es decir, Tony,77
, se considera en la salida.
Combinar maps y sumar los valores con la misma clave
Método 1:
Como usar ++
fusiona los maps pero elimina el duplicado, la idea aquí es primero convertir los maps en una lista usando toList
, luego fusionarlos para que se conserven los duplicados y luego usar groupBy
la función de la lista para agrupar los valores basados en claves y sumar los valores
para las mismas claves.
Código de ejemplo:
object Main {
def main(args: Array[String])
{
val map1_english = Map("Tony" -> 50, "Ruby" -> 89)
val map2_maths = Map("Tony"->77,"Ruby" -> 100, "Ben" -> 78)
val mergedList = map1_english.toList ++ (map2_maths.toList)
println("Merged List : " + mergedList)
val mergedKeys = mergedList.groupBy(_._1).map{case (k,v) => k -> v.map(_._2).sum}
println("Merged Map with summed up values : " + mergedKeys)
}
}
Producción :
Merged List : List((Tony,50), (Ruby,89), (Tony,77), (Ruby,100), (Ben,78))
Merged Map with summed up values : Map(Ruby -> 189, Ben -> 78, Tony -> 127)
Método 2:
Usando el método merged
disponible con HashMap.
Código de ejemplo:
object Main {
def main(args: Array[String])
{
val map1_english = collection.immutable.HashMap("Tony" -> 50, "Ruby" -> 89)
val map2_maths = collection.immutable.HashMap("Tony"->77,"Ruby"-> 100, "Ben"->78)
val merged = map1_english.merged(map2_maths)({ case ((k,v1),(_,v2)) =>(k,v1+v2)})
println("Merged Map with summed up values : " + merged)
}
}
Producción :
Merged Map with summed up values : Map(Ruby -> 189, Tony -> 127, Ben -> 78)