在 Kotlin 中遇到 mutablemap 问题
Having an issue with mutablemap in Kotlin
我正在处理一个算法类型的挑战,我正在通过打印语句进行调试,但我似乎无法弄清楚为什么键的值不是我所期望的
var mapNums = mutableMapOf<Int, Int>()
//imaginary array
//var nums = [34,28,11,21,3,34,8,7,34,7,31,7,3,28,18]
var count = 0
for (n in nums) {
if (mapNums.containsKey(n)) {
count ++
mapNums[n] = count
} else if (!mapNums.containsKey(n)) {
count = 1
mapNums[n] = count
}
}
println(mapNums)
//prints {34=2, 28=4, 11=1, 21=1, 3=3, 8=1, 7=2, 31=1, 18=1}
如您所见,键和值不是它们应有的样子,我不确定为什么。
这是因为您在循环外重复使用了相同的 count
变量,因此它不断从不同的键递增。
相反,您应该从地图中获取当前计数,然后将其放回原位:
val nums = intArrayOf(34,28,11,21,3,34,8,7,34,7,31,7,3,28,18)
val mapNums = mutableMapOf<Int, Int>()
for (n in nums) {
val count = mapNums[n] ?: 0
mapNums[n] = count + 1
}
println(mapNums) // {34=3, 28=2, 11=1, 21=1, 3=2, 8=1, 7=3, 31=1, 18=1}
首先检查 n number 是否包含此映射作为键,如果找到则使用 plus 方法将其值递增 1。如果未从地图中找到任何值,它将为 null 并检查是否为 null 并设置 1.
var mapNums = mutableMapOf<Int, Int>()
//imaginary array
var nums = arrayOf(34,28,11,21,3,34,8,7,34,7,31,7,3,28,18)
for (n in nums) {
mapNums[n] = mapNums[n]?.plus(1) ?: 1
}
println(mapNums)
您可以使用以下代码生成所需的地图:
val nums = intArrayOf(34, 28, 11, 21, 3, 34, 8, 7, 34, 7, 31, 7, 3, 28, 18).toList()
println(nums.groupingBy { it }.eachCount())
此处 groupingBy
使用与键选择器相同的元素创建 Grouping
源。然后 eachCount
按键对分组源中的元素进行分组,并对每组中的元素进行计数。
您还可以参考文档以获取有关 groupingBy and eachCount 的更多信息。
我正在处理一个算法类型的挑战,我正在通过打印语句进行调试,但我似乎无法弄清楚为什么键的值不是我所期望的
var mapNums = mutableMapOf<Int, Int>()
//imaginary array
//var nums = [34,28,11,21,3,34,8,7,34,7,31,7,3,28,18]
var count = 0
for (n in nums) {
if (mapNums.containsKey(n)) {
count ++
mapNums[n] = count
} else if (!mapNums.containsKey(n)) {
count = 1
mapNums[n] = count
}
}
println(mapNums)
//prints {34=2, 28=4, 11=1, 21=1, 3=3, 8=1, 7=2, 31=1, 18=1}
如您所见,键和值不是它们应有的样子,我不确定为什么。
这是因为您在循环外重复使用了相同的 count
变量,因此它不断从不同的键递增。
相反,您应该从地图中获取当前计数,然后将其放回原位:
val nums = intArrayOf(34,28,11,21,3,34,8,7,34,7,31,7,3,28,18)
val mapNums = mutableMapOf<Int, Int>()
for (n in nums) {
val count = mapNums[n] ?: 0
mapNums[n] = count + 1
}
println(mapNums) // {34=3, 28=2, 11=1, 21=1, 3=2, 8=1, 7=3, 31=1, 18=1}
首先检查 n number 是否包含此映射作为键,如果找到则使用 plus 方法将其值递增 1。如果未从地图中找到任何值,它将为 null 并检查是否为 null 并设置 1.
var mapNums = mutableMapOf<Int, Int>()
//imaginary array
var nums = arrayOf(34,28,11,21,3,34,8,7,34,7,31,7,3,28,18)
for (n in nums) {
mapNums[n] = mapNums[n]?.plus(1) ?: 1
}
println(mapNums)
您可以使用以下代码生成所需的地图:
val nums = intArrayOf(34, 28, 11, 21, 3, 34, 8, 7, 34, 7, 31, 7, 3, 28, 18).toList()
println(nums.groupingBy { it }.eachCount())
此处 groupingBy
使用与键选择器相同的元素创建 Grouping
源。然后 eachCount
按键对分组源中的元素进行分组,并对每组中的元素进行计数。
您还可以参考文档以获取有关 groupingBy and eachCount 的更多信息。