合并 map kotlin 中的值

2022-09-01 18:30:35

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

例如:

val mapA = mapOf("Emergency" to "112", "Fire department" to "101", "Police" to "102")
val mapB = mapOf("Emergency" to "911", "Police" to "102")

最终结果应如下所示:

{"Emergency" to "112, 911", "Fire department" to "101", "Police" to "102"}

这是我的函数:

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
}

答案 1

怎么样:

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

结果:

{Emergency=112,911, Fire department=101, Police=102}

这将:

  • 生成两个映射的键值对的惰性Sequence
  • 按键对它们进行分组(结果:Map<String, List<String>)
  • 将其值映射到逗号连接的字符串(结果:Map<String, String>)

答案 2

您可以执行以下操作:

(mapA.keys + mapB.keys).associateWith {
    setOf(mapA[it], mapB[it]).filterNotNull().joinToString()
}
  1. 将所有键放在一个集合中
  2. 循环访问该集合,并将每个元素与该组值相关联
  3. 从值集中删除空值
  4. 使用 连接值列表中的元素。joinToString()

推荐