在 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())

try it yourself

此处 groupingBy 使用与键选择器相同的元素创建 Grouping 源。然后 eachCount 按键对分组源中的元素进行分组,并对每组中的元素进行计数。

您还可以参考文档以获取有关 groupingBy and eachCount 的更多信息。