Fusionner deux maps dans Scala puis additionner les valeurs avec la même clé
-
Fusion de deux maps dans Scala à l’aide de l’opérateur
++ - Fusionner des maps et additionner les valeurs avec la même clé
Nous verrons comment les Maps sont fusionnées en utilisant ++ dans Scala, puis nous verrons différentes manières de fusionner et de sommer les valeurs avec la même clé avec la méthode modifiée ++ et merged disponible avec HashMap.
Fusion de deux maps dans Scala à l’aide de l’opérateur ++
Syntaxe:
map1.++(map2)
Ici, map2 est fusionné avec map1, et la map résultante est renvoyée en sortie. ++ fusionne les maps, mais élimine les doublons ; la dernière paire clé, valeur est prise en compte chaque fois qu’un conflit survient entre les clés.
Exemple de code :
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)
}
}
Production :
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)
On peut observer que la dernière paire clé, valeur c’est-à-dire Tony,77 est considérée en sortie.
Fusionner des maps et additionner les valeurs avec la même clé
Méthode 1 :
Comme utiliser ++ fusionne les maps mais élimine le doublon, l’idée ici est d’abord de convertir les maps en une liste en utilisant toList, puis de les fusionner afin que les doublons soient conservés, puis d’utiliser le groupBy la fonction de la liste pour regrouper les valeurs en fonction des clés et additionner les valeurs pour les mêmes clés.
Exemple de code :
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)
}
}
Production :
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éthode 2 :
Utilisation de la méthode merged disponible avec HashMap.
Exemple de code :
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)
}
}
Production :
Merged Map with summed up values : Map(Ruby -> 189, Tony -> 127, Ben -> 78)
