kotlin - map : Kotlin 中的重复值

标签 kotlin

我有一个场景,我需要一个包含重复键和值的映射。我首先创建了一个列表,然后使用关联将它们转换为 map ,但是没有考虑重复问题。这是我的实现:

class State(private val startStatus: Status, private val expectedStatus: Status) {
  
  companion object StatusList {
    val listStatuses = listOf(
      State(Status.A, Status.B),
      State(Status.B, Status.A),
      State(Status.B, Status.C),
      State(Status.C, Status.B),
      State(Status.C, Status.E),
      State(Status.C, Status.D),
      State(Status.D, Status.B),
      State(Status.E, Status.C),
      State(Status.E, Status.B)
    )
  
    open fun mapStatuses(): Map<Status, Collection<Status>> {
      return listStatuses.associateBy(
        keySelector = { key -> key.expectedStatus },
        valueTransform = State::startStatus)
    }
  }
}

我正在努力在 Kotlin 中找到一个可以让我处理重复项的 Multimap。你能帮忙吗?

谢谢

最佳答案

简而言之,Kotlin 中没有多重映射。

多重映射将允许多个具有不同值的等效键 - 这可以通过唯一键和与给定键关联的值集合来实现,而不是查看具有等效键的键值对集合。

因此,您可以使用groupBy():

data class Record(val id: Int, val name: String)

fun main() {
    val records = listOf(
            Record(1, "hello"),
            Record(1, "there"),
            Record(2, "general"),
            Record(2, "kenobi")
    )

    val mapped = records.groupBy({ it.id }, { it.name })

    for (entry in mapped) {
        println("${entry.key} -> ${entry.value.joinToString()}")
    }
}

这里我使用 groupBy 和键的投影(即 Recordid)和值的投影(即Record名称)。与您的 StateStatus 非常相似。

关于kotlin - map : Kotlin 中的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62835436/

相关文章:

java - Java "assign and check"的 Kotlin 等价物是什么?

java - 服务器重启后如何将 HazelcastClient 重新连接到 HazelcastServer

android - RecyclerView - 字母索引未出现

java.lang.IllegalStateException : android.accessibilityservice.AccessibilityService.getSystemService(AccessibilityService.java:1602)

java - KTor 还是 Spark?哪个已为 Kotlin Web 服务做好生产准备?

reflection - Kotlin使用反射调用构造函数

java - 使用 Java 接口(interface)时的 Kotlin 接口(interface)实现行为

android - 弱引用在 Kotlin 中不起作用

java - Android Media Codec API 基本示例

kotlin - 文件可以在IntelliJ插件中编译正常,但不能使用kotlinc命令行编译器进行编译