如何使用不可变转换在Kotlin中反转映射

如何使用不可变转换在Kotlin中反转映射,kotlin,Kotlin,我有一个下面的Kotlin映射,我想反转映射,对于复制的新键,值将被附加到列表中 val map = Map(1 to 111, 2 to 222, 3 to 111) 转换后,将生成结果映射 Map(111 to List(1,3), 222 to 2) PS:我确实找到了一种方法,通过创建一个可变的映射并迭代现有的映射。但我更多的是寻找一种不变的方法。你应该可以这样做: fun reverse(map: Map<Int, Int>): Map<Int, List<

我有一个下面的Kotlin映射,我想反转映射,对于复制的新键,值将被附加到列表中

val map = Map(1 to 111, 2 to 222, 3 to 111)
转换后,将生成结果映射

Map(111 to List(1,3), 222 to 2)

PS:我确实找到了一种方法,通过创建一个可变的映射并迭代现有的映射。但我更多的是寻找一种不变的方法。你应该可以这样做:

fun reverse(map: Map<Int, Int>): Map<Int, List<Int>> {
  val mm = mutableMapOf<Int, List<Int>>()
  map.forEach { k, v -> mm[v] = mm.getOrDefault(v, listOf()) + k }

  return mm
}
fun reverse(地图:地图):地图{
val mm=mutableMapOf()
map.forEach{k,v->mm[v]=mm.getOrDefault(v,listOf())+k}
返回mm
}

它将为您留下一个所有映射值的列表,但它会反转映射。

您应该能够执行以下操作:

fun reverse(map: Map<Int, Int>): Map<Int, List<Int>> {
  val mm = mutableMapOf<Int, List<Int>>()
  map.forEach { k, v -> mm[v] = mm.getOrDefault(v, listOf()) + k }

  return mm
}
fun reverse(地图:地图):地图{
val mm=mutableMapOf()
map.forEach{k,v->mm[v]=mm.getOrDefault(v,listOf())+k}
返回mm
}

它将为您留下一个所有映射值的列表,但它确实会反转映射。

这里有一个简单的方法,可以在不使用可变集合的情况下执行此操作,更重要的是,它包括:


这里有一个不使用可变集合的简洁方法,更重要的是:


您可以通过从每个条目中选择键来对地图条目进行分组:

    val map = mapOf(1 to 111, 2 to 222, 3 to 111)

    val reversed = map.entries.groupBy({ it.value }, { it.key })

    println(reversed) // prints: {111=[1, 3], 222=[2]}

您可以通过从每个条目中选择键来对地图条目进行分组:

    val map = mapOf(1 to 111, 2 to 222, 3 to 111)

    val reversed = map.entries.groupBy({ it.value }, { it.key })

    println(reversed) // prints: {111=[1, 3], 222=[2]}

谢谢,我想我没有说清楚。我更多的是寻找一种不变的方法。不仅仅是在事后将
MutableMap
转换成Map?@ttt你在
不变的方法下是什么意思?虽然目标映射填充了转换后的值,但它必须是可变的。谢谢,我想我没有清楚地描述它。我更多的是寻找一种不变的方法。不仅仅是在事后将
MutableMap
转换成Map?@ttt你在
不变的方法下是什么意思?虽然目标映射填充了转换后的值,但它必须是可变的。