如何使用不可变转换在Kotlin中反转映射
我有一个下面的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<
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你在不变的方法下是什么意思?虽然目标映射填充了转换后的值,但它必须是可变的。