如何用Kotlin实现数组元素去重及频率统计?求助修正代码
Kotlin数组元素频率统计代码修正
原代码存在的问题
- 内层循环访问
a[j+1]会触发数组越界(当j为数组最后一个索引时,j+1超出数组范围) - 循环逻辑完全错误:仅比较相邻元素无法统计每个元素的总出现次数
numbers和frequency数组未指定类型,且初始化方式不符合需求,无法正确存储数据
修正方案
方案1:使用Kotlin标准库函数(简洁高效)
借助groupBy快速分组统计元素频率,再拆分到目标数组:
val n = 8 val a = arrayOf(1, 3, 2, 4, 2, 1, 9, 1) // 统计每个元素的出现次数 val frequencyMap = a.groupBy { it }.mapValues { it.value.size } // 拆分到numbers和frequency数组 val numbers = frequencyMap.keys.toTypedArray() val frequency = frequencyMap.values.toTypedArray() // 验证输出 println("numbers = ${numbers.contentToString()}") println("frequency = ${frequency.contentToString()}")
输出结果:
numbers = [1, 3, 2, 4, 9] frequency = [3, 1, 2, 1, 1]
方案2:手动循环实现(适合理解底层逻辑)
如果不想依赖标准库,手动遍历统计元素出现次数:
val n = 8 val a = arrayOf(1, 3, 2, 4, 2, 1, 9, 1) // 先用List存储,方便动态添加元素 val numbersList = mutableListOf<Int>() val frequencyList = mutableListOf<Int>() for (num in a) { val index = numbersList.indexOf(num) if (index == -1) { // 元素首次出现,加入列表并初始化频率为1 numbersList.add(num) frequencyList.add(1) } else { // 元素已存在,对应频率+1 frequencyList[index] = frequencyList[index] + 1 } } // 转换为Array类型(按需使用) val numbers = numbersList.toTypedArray() val frequency = frequencyList.toTypedArray() // 验证输出 println("numbers = ${numbers.contentToString()}") println("frequency = ${frequency.contentToString()}")
输出结果与预期完全一致。
内容的提问来源于stack exchange,提问作者Shahina Ismoilova
相关产品推荐
相关产品推荐

