【问题标题】:In Kotlin: What is an elegant way to sum two values of a common key from two maps?在 Kotlin 中:从两个映射中求和一个公共键的两个值的优雅方法是什么?
【发布时间】:2020-10-11 17:09:04
【问题描述】:

我有一个现有的地图,其中包含简单的整数值。我想通过包含 其中一个可能键的给定映射的值来更新现有映射。

val originMap = mutableMapOf("Foo" to 10, "Bar" to 5)
val additionalMap = mapOf("Foo" to 4)

// questioned logic

assertThat(originMap).containsEntry("Foo", 14)

【问题讨论】:

    标签: java dictionary kotlin


    【解决方案1】:

    如果您想就地使用originMap 而不是声明新的Map,您可以通过forEach 的副作用将addtionalMap 合并到其中:

    additionalMap.forEach { (k, v) -> originMap.merge(k, v, Int::plus) }
    // Prints {Foo=14, Bar=5}
    

    这将从additionalMap获取每个键(k)和值(v),并使用Int::plus将其添加到originMap中的值。

    【讨论】:

    • 也想过。 merge 来自 Java API,尽管它将代码限制为 JVM(这可能没问题)。
    • 是的,这很公平。
    【解决方案2】:

    你可以这样做:

    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)]
    

    Try it here!

    【讨论】:

    • 这看起来不错,但通过putAll() 之类的便利功能而不是替换概念,这不可能实现
    • @xetra11 据我所知,Kotlin 标准库不提供。 :(
    【解决方案3】:

    类似于之前的 answer,但没有 JVM 特定的 API:

    additionalMap.forEach { (k, v) -> originMap[k] = (originMap[k] ?: 0) + v }
    

    【讨论】:

      【解决方案4】:

      上述解决方案有一个小错误,它会将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}
      

      【讨论】:

        猜你喜欢
        • 2021-05-11
        • 2012-06-03
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2017-01-22
        • 2020-05-13
        • 1970-01-01
        相关资源
        最近更新 更多