在 map kotlin 中合并值

新手上路,请多包涵

我需要合并地图 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
}

原文由 rost 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 900
2 个回答

怎么样:

 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>

原文由 Salem 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以执行以下操作:

 (mapA.keys + mapB.keys).associateWith {
    setOf(mapA[it], mapB[it]).filterNotNull().joinToString()
}

  1. 将所有键放在一个集合中
  2. 遍历该集合并将每个元素与值集合相关联
  3. 从值集中删除空值
  4. 使用 joinToString() 连接值列表中的元素。

原文由 Willi Mentzel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题