[英]How to get common values from two different maps in the fastest possible way?
[英]In Kotlin: What is an elegant way to sum two values of a common key from two maps?
我有一個現有的地圖,其中包含簡單的整數值。 我想通過包含可能鍵之一的給定地圖的值更新現有地圖。
val originMap = mutableMapOf("Foo" to 10, "Bar" to 5)
val additionalMap = mapOf("Foo" to 4)
// questioned logic
assertThat(originMap).containsEntry("Foo", 14)
你可以這樣做:
val mergedMap = (originMap.toList() + additionalMap.toList())
.groupBy({ it.first }, { it.second })
.map { (key, values) -> key to values.sum() }
.toMap()
println(mergedMap) // [(Foo, 14), (Bar, 5)]
如果你想使用originMap
就地而不是宣布一個新的Map
,你可以合並addtionalMap
通過的副作用為它forEach
:
additionalMap.forEach { (k, v) -> originMap.merge(k, v, Int::plus) }
// Prints {Foo=14, Bar=5}
這將從additionalMap
獲取每個鍵 ( k
) 和值 ( v
),並使用Int::plus
將其添加到originMap
的值。
與之前的答案類似,但沒有 JVM 特定的 API:
additionalMap.forEach { (k, v) -> originMap[k] = (originMap[k] ?: 0) + v }
上述方案有一個小錯誤,這將增加所有附加鍵在additionalMap
其中不存在於originalMap
的結果。 下面的含義將產生這樣的輸出:
val originMap = mutableMapOf("Foo" to 10, "Bar" to 5)
val additionalMap = mapOf("Foo" to 4, "Baz" to 3)
additionalMap.forEach { (k, v) -> if (originMap.containsKey(k)) originMap.merge(k, v, Int::plus) }
// Prints {Foo=14, Bar=5, Baz=3}
因此,沒有小錯誤的相同解決方案如下所示:
additionalMap.forEach { (k, v) -> if (originMap.containsKey(k)) originMap.merge(k, v, Int::plus) }
// Prints {Foo=14, Bar=5}
如果擔心 JVM 特定的 API:那么就像
additionalMap.forEach { (k, v) -> if (originMap[k] != null) originMap[k] = (originMap[k] ?: 0) + v }
// Prints {Foo=14, Bar=5}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.