Fusionar dos maps en Scala y luego sumar los valores con la misma clave

Suraj P 30 enero 2023
  1. Fusionando dos maps en Scala usando el operador ++
  2. Combinar maps y sumar los valores con la misma clave
Fusionar dos maps en Scala y luego 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)
Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

Artículo relacionado - Scala Map