Scala 合併兩個Map

2021-10-05 23:54:37 字數 1928 閱讀 4410

把scala的兩個map合併,合併的時候會遇到相同的鍵和不同的鍵,

scala> val m1 =

map(1-

>10,

2->4)

m1: scala.collection.immutable.map[int,int]

=map(1

->10,

2->4)

scala> val m2 =

map(2-

>5,

4->8)

m2: scala.collection.immutable.map[int,int]

=map(2

->5,

4->

8)

想要的結果:

m3: scala.collection.immutable.map[int,int]

=map(1

->10,

2->9,

4->

8)

採用scala ++後的結果:

scala> m1 ++ m2

res0: scala.collection.immutable.map[int,int]

=map(1

->10,

2->5,

4->

8)

這裡結果顯然不符合預期,我們希望key=2的value是4+5=9,而這裡等於5,說明在兩個map merge時第二個map的key-value:(2,5)覆蓋了第乙個map的值(2,4).

此種方法最為簡單,就不進行示例。

scala> val list = m1.tolist ++ m2.tolist

//list: list[(int, int)] = list((1,10), (2,4), (2,5), (4,8))

scala> val merged = list

.groupby

( _._1)

.map

//merged: scala.collection.immutable.map[int,int] = map(2 -> 9, 4 -> 8, 1 -> 10)

此方法先把map轉化成list,然後進行乙個groupby操作,把相同的key聚合到一起,之後進行乙個求和。該方法有點是可以處理更多個map的merge,但缺點也是顯而易見的,map轉化為list又轉回map造成了一定開銷,並且groupby代價比較大。

scala> val merged =

(m1 /

: m2)

//merged: scala.collection.immutable.map[int,int] =

//map(1 -> 10, 2 -> 9, 4 -> 8)

這部分**比較抽象,其中(m1 /: m2) 等價於 m2.foldleft(m1),可以形象地理解為向左摺疊。而foldleft引數需要接收兩個,另外乙個引數列表使用case 匹配到乙個結果map 和 當前m1中的乙個(k,v) pair,這個pair就是foldleft過程中遍歷的每乙個值。通過這些操作最終獲得我們需要的結果。

scala -cp scalaz-core_2.11-7.1.1.jar
在shell中匯入scalaz.scalaz._就可以使用它的隱式「|+|」操作符來merge我們的兩個map了,非常簡潔。

scala>

import scalaz.scalaz._

import scalaz.scalaz._

scala> m1 |+| m2

res5: scala.collection.immutable.map[int,int]

= map(2 -> 9, 4 -> 8, 1 -> 10)

Scala 之 合併兩個map

開發中遇到需求 合併兩個map集合物件 將兩個對應key的值累加 先說解決方案 map1 map2 這特麼什麼鬼 首先 scala中現有的合併集合操作不能滿足這個需求 注意合併後的結果a的g02的值其實是被覆蓋掉了。然後 說說那個表示式中 a b 這部分是什麼鬼。這個其實是scala簡化的foldl...

合併兩個byte

byte sshead system.text.encoding.unicode.getbytes this is head byte sscontent system.text.encoding.unicode.getbytes this is content.sshead sscontent b...

合併兩個DataTable

方法1 sqlconnection myconnection new sqlconnection server localhost uid sa pwd database wjoa string sql1 select from resoursemanage t sqldataadapter ada...