0

我正在处理算法类型挑战,我正在通过打印语句进行调试,我似乎无法弄清楚为什么键的值不是我所期望的

 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}

正如您所看到的,键和值不是它们应该是的,我不知道为什么。

4

3 回答 3

3

这是因为您在循环之外重用了相同的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}
于 2021-11-24T17:23:45.780 回答
3

您可以使用以下代码生成所需的地图:

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按键对 Grouping 源中的元素进行分组,并对每个组中的元素进行计数。

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

于 2021-11-24T17:58:56.190 回答
0

首先检查 n 个数字是否包含此映射作为键,如果找到,则使用 plus 方法将其值增加 1。如果未从地图中找到任何值,它将为空并检查是否为空并设置为 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)
于 2021-11-24T17:31:00.847 回答