[英]Fold from Map[String,List[Int]] to Map[String,Int]
我對Scala和一般的功能方法都很新。 我有一個看起來像這樣的地圖:
val myMap: Map[String, List[Int]]
我想最終將鍵映射到關聯列表的總和:
val totalsMap: Map[String, Int]
我最初的預感是使用一個理解:
val totalsMap = for (kvPair <- myMap) {
kvPair._2.foldLeft(0)(_+_)
}
但是我不知道我會在yield()子句中添加什么來從for for comprehension中獲取一個map。
你可以使用mapValues,
val totalMap = myMap.mapValues(_.sum)
但是mapValues會在每次從Map獲取密鑰時重新計算總和。 例如,如果多次執行totalMap(“a”),則每次都會重新計算總和。
如果你不想要這個,你應該使用
val totalMap = myMap map {
case (k, v) => k -> v.sum
}
mapValues
更適合這種情況:
val m = Map[String, List[Int]]("a" -> List(1,2,3), "b" -> List(4,5,6))
m.mapValues(_.foldLeft(0)(_+_))
res1: scala.collection.immutable.Map[String,Int] = Map(a -> 6, b -> 15)
或者沒有foldLeft
:
m.mapValues(_.sum)
val m = Map("hello" -> Seq(1, 1, 1, 1), "world" -> Seq(1, 1))
for ((k, v) <- m) yield (k, v.sum)
產量
Map(hello -> 4, world -> 2)`
for comprehension將返回你給它的任何monadic類型。 在這種情況下, m
是一個Map
,所以這就是它的結果。 yield
必須返回一個元組。 第一個元素(成為每個Map
條目中的鍵)是您正在計算的單詞,第二個元素(您猜對了,每個Map
條目中的值)成為原始計數序列的總和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.