在 Scala 中合併兩個 map,然後將具有相同鍵的值相加
Suraj P
2023年1月30日
我們將看到 Maps
如何在 Scala 中使用 ++
進行合併,然後,我們將使用修改後的 ++
和 merged
方法檢視不同的方法來合併和求和具有相同鍵的值雜湊 map。
在 Scala 中使用 ++
運算子合並兩個 map
語法:
map1.++(map2)
這裡 map2 與 map1 合併,結果 map
作為輸出返回。++
確實合併了 map,但它消除了重複;每當鍵之間發生衝突時,都會考慮最新的鍵,值
對。
示例程式碼:
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)
}
}
輸出:
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)
可以觀察到,在輸出中考慮了最新的 key, value
對,即 Tony,77
。
合併 map 並對具有相同鍵的值求和
方法一:
由於使用++
確實合併了 map 但它消除了重複,這裡的想法是首先使用 toList
將 map 轉換為列表,然後合併它們以便保留重複,然後使用 groupBy
列表的功能是根據鍵對值進行分組並對相同鍵的值
求和。
示例程式碼:
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)
}
}
輸出:
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)
方法二:
使用 HashMap 提供的 merged
方法。
示例程式碼:
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)
}
}
輸出:
Merged Map with summed up values : Map(Ruby -> 189, Tony -> 127, Ben -> 78)