Scala map集合合并不覆蓋重復(fù)key值,函數(shù)foldLeft

簡單介紹一下姐呐,Scala語言中殿怜,foldLeft函數(shù)的三個使用場景:

  • 列表內(nèi)數(shù)值的相加,作用相當(dāng)于sum;
  • 變換后的Map集合有重復(fù)key值曙砂,并且需要根據(jù)key值合并
  • 合并Map重復(fù)key值統(tǒng)計詞長度

場景一:列表數(shù)值相加头谜,先上代碼:

scala> val list1 = List(1,2,3,4,5)
list1: List[Int] = List(1, 2, 3, 4, 5)

scala> println(list1.foldLeft(0) { (sum, i) => sum + i})
15

scala> println(list1.sum)
15

從代碼中可以看出,foldLeft函數(shù)此時的作用相當(dāng)于sum鸠澈。foldLeft后加圓括號柱告,圓括號中寫入初始值,因為要算整個List中每一個元素的和笑陈,因此际度,此時初始值為Int型的0。 之后的 (sum, i) => sum + i} 則表示涵妥,對于每一個List中的i元素乖菱,將i與sum相加,并將結(jié)果保存在sum中妹笆。foldLeft是從左往右遍歷块请,而與它相對應(yīng)的是函數(shù)foldRight,foldRight從右向左遍歷拳缠。

場景二:合并兩個Map墩新,重復(fù)key值相加,不覆蓋

在Scala的Map集合操作中窟坐,沒有直接將兩個Map根據(jù)key值合并value的操作海渊,若是直接將兩個Map相加,那么相同的key的值將會被后邊的值覆蓋哲鸳,例如:

scala> val map1 = Map("aa" -> 1.0, "bb" -> 2.0)
map1: scala.collection.immutable.Map[String,Double] = Map(aa -> 1.0, bb -> 2.0)

scala> val map2 = Map("aa" -> 2.0, "cc" -> 4.0)
map2: scala.collection.immutable.Map[String,Double] = Map(aa -> 2.0, cc -> 4.0)

scala> println(map1 ++ map2)
Map(aa -> 2.0, bb -> 2.0, cc -> 4.0)

可見臣疑,直接暴力相加的話會覆蓋重復(fù)key的value值,如果想計算不同長度單詞的詞頻徙菠,單純將map中的key變換為key的長度讯沈,再對value進(jìn)行操作是不可取的。
可以使用foldLeft函數(shù)實現(xiàn):

scala> val map1 = Map("a" -> 1, "b" -> 2)
map1: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)

scala> val map2 = Map("b" -> 4, "c" -> 8)
map2: scala.collection.immutable.Map[String,Int] = Map(b -> 4, c -> 8)

scala> val mergeMap = map1.foldLeft(map2) {
     | case (newMap, (name, score)) => 
     | newMap + (name -> (score + map2.getOrElse(name, 0)))
     | }
mergeMap: scala.collection.immutable.Map[String,Int] = Map(b -> 6, c -> 8, a -> 1)

需要說明的是婿奔,newMap為定義的新map缺狠,name 和 score為模式匹配的新定義名稱问慎,這三個變量雖然都是新定義變量,但是都不需要提前val/var定義挤茄,可直接使用如叼。此時 newMap 的數(shù)據(jù)類型為 Map[String,Int],name的數(shù)據(jù)類型為String穷劈,score的數(shù)據(jù)類型為Int
根據(jù)結(jié)果可知笼恰,經(jīng)過foldLeft之后,map相同key的value沒有被覆蓋歇终,而是相加合并了社证。

場景三: 合并Map重復(fù)key值統(tǒng)計詞長度

若一個Map中key為單詞,value為這個單詞的詞頻练湿,我們?nèi)粝敫鶕?jù)單詞的長度統(tǒng)計不同長度單詞的總詞頻猴仑,就會需要foldLeft函數(shù)出場

foldLeft可以對map的value值進(jìn)行相加,再這個場景下可以這樣寫:

scala> val wordsMap = Map("apple" -> 20, "pear" -> 10, "pineapple" -> 25, "grape" -> 30)
wordsMap: scala.collection.immutable.Map[String,Int] = Map(apple -> 20, pear -> 10, pineapple -> 25, grape -> 30)

scala> val wordFreqCount = wordsMap.foldLeft(Map.empty[Int, Int]) {
     |       case (newMap, (fruit, count)) =>
     |         newMap + (fruit.length -> (count + newMap.getOrElse(fruit.length, 0)))
     |     }
wordFreqCount: scala.collection.immutable.Map[Int,Int] = Map(5 -> 50, 4 -> 10, 9 -> 25)

首先在foldLeft函數(shù)中傳入?yún)?shù)肥哎,即新map的初始值Map.empty[Int, Int], 然后根據(jù)case模式匹配辽俗,定義新map為newMap,對每一個原map中的值(fruit, count), 拿出fruit的單詞length篡诽,并且相加崖飘,賦到newMap中,就能得到我們想要的結(jié)果杈女。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朱浴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子达椰,更是在濱河造成了極大的恐慌翰蠢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啰劲,死亡現(xiàn)場離奇詭異梁沧,居然都是意外死亡,警方通過查閱死者的電腦和手機蝇裤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門廷支,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栓辜,你說我怎么就攤上這事恋拍。” “怎么了藕甩?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵施敢,是天一觀的道長。 經(jīng)常有香客問我,道長僵娃,這世上最難降的妖魔是什么羡藐? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮悯许,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辉阶。我一直安慰自己先壕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布谆甜。 她就那樣靜靜地躺著垃僚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪规辱。 梳的紋絲不亂的頭發(fā)上谆棺,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音罕袋,去河邊找鬼改淑。 笑死,一個胖子當(dāng)著我的面吹牛浴讯,可吹牛的內(nèi)容都是我干的朵夏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榆纽,長吁一口氣:“原來是場噩夢啊……” “哼仰猖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奈籽,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饥侵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衣屏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躏升,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年勾拉,在試婚紗的時候發(fā)現(xiàn)自己被綠了煮甥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡藕赞,死狀恐怖成肘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斧蜕,我是刑警寧澤双霍,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響洒闸,放射性物質(zhì)發(fā)生泄漏染坯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一丘逸、第九天 我趴在偏房一處隱蔽的房頂上張望单鹿。 院中可真熱鬧,春花似錦深纲、人聲如沸仲锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儒喊。三九已至,卻和暖如春币呵,著一層夾襖步出監(jiān)牢的瞬間怀愧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工余赢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芯义,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓妻柒,卻偏偏與公主長得像毕贼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛤奢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容