Kotlin中使用mutableMap出现键对应值不符合预期问题排查
问题根因
代码的核心错误是共用全局count变量统计所有元素的频次,没有为每个键单独维护出现次数,逻辑完全错位:
- 遇到已存在的键时,累加的全局
count根本不是当前键的出现次数,而是之前所有操作累计出的混乱数值 - 遇到新键时,直接把全局
count重置为1,会直接冲掉之前其他元素的计数状态
修正方案
正确逻辑应该是每次遍历到元素时,直接读取Map中当前元素对应的旧计数,加1后更新存储,不需要额外的全局计数变量:
var mapNums = mutableMapOf<Int, Int>() val nums = arrayOf(34,28,11,21,3,34,8,7,34,7,31,7,3,28,18) for (n in nums) { // 键不存在时默认取0,加1后更新 mapNums[n] = mapNums.getOrDefault(n, 0) + 1 } println(mapNums) // 输出:{34=3, 28=2, 11=1, 21=1, 3=2, 8=1, 7=3, 31=1, 18=1},和实际频次完全匹配
兼容原有判断逻辑的修正版
如果不想使用getOrDefault,沿用你原来的分支判断写法也可以,需要把计数逻辑限定在当前键的已有值范围内:
var mapNums = mutableMapOf<Int, Int>() val nums = arrayOf(34,28,11,21,3,34,8,7,34,7,31,7,3,28,18) for (n in nums) { if (mapNums.containsKey(n)) { // 直接读取当前键已有的计数加1,不使用全局count mapNums[n] = mapNums[n]!! + 1 } else { // 首次出现直接设为1 mapNums[n] = 1 } } println(mapNums)
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

