簡體   English   中英

從Map [String,List [Int]]折疊到Map [String,Int]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM