合并地图kotlin中的值

A.R*_*ost 9 java kotlin

我需要合并地图mapAmapB成对的"名称" - "电话号码"到最终地图中,将重复键的值粘在一起,用逗号分隔.重复值只应添加一次.在语言方法方面,我需要最惯用和最正确的方法.

例如:

val mapA = mapOf("Emergency" to "112", "Fire department" to "101", "Police" to "102")
val mapB = mapOf("Emergency" to "911", "Police" to "102")
Run Code Online (Sandbox Code Playgroud)

最终结果应如下所示:

{"Emergency" to "112, 911", "Fire department" to "101", "Police" to "102"}
Run Code Online (Sandbox Code Playgroud)

这是我的功能:

fun mergePhoneBooks(mapA: Map<String, String>, mapB: Map<String, String>): Map<String, String> {
    val unionList: MutableMap <String, String> = mapA.toMutableMap()
    unionList.forEach { (key, value) -> TODO() } // here's I can't come on with a beatiful solution

    return unionList
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*zel 10

您可以执行以下操作:

(mapA.keys + mapB.keys).associateWith {
    setOf(mapA[it], mapB[it]).filterNotNull().joinToString()
}
Run Code Online (Sandbox Code Playgroud)
  1. 把所有的钥匙放在一个集合中
  2. 迭代该集合并将每个元素与值集相关联
  3. 从值集中删除空值
  4. 使用 连接值列表中的元素joinToString()

  • 该死的......那个`associateWith`是我正在寻找的,但不记得了:-) (2认同)

Moi*_*ira 9

怎么样:

val unionList = (mapA.asSequence() + mapB.asSequence())
    .distinct()
    .groupBy({ it.key }, { it.value })
    .mapValues { (_, values) -> values.joinToString(",") }
Run Code Online (Sandbox Code Playgroud)

结果:

{Emergency=112,911, Fire department=101, Police=102}
Run Code Online (Sandbox Code Playgroud)

这将:

  • 产生Sequence两个地图的键值对的延迟
  • 由密钥组它们(结果:Map<String, List<String>)
  • 它们的值映射到逗号接合字符串(结果:Map<String, String>)

  • 请注意,如果地图具有相同的键和值,则此解决方案将无法合并,合并`{A = 1,B = 2}`和`{A = 5,B = 2}`将导致合并成{{A = 6 ,B = 2}` (2认同)