Kotlin如何统计数组中各元素的出现次数并支持动态更新
实现方案
方案1:无侵入实时统计(适合小规模列表)
无需修改原有列表定义,每次需要获取统计结果时调用标准库API实时计算,天然自动同步列表最新内容:
val list = arrayListOf("A", "B", "C", "A", "A", "B") // 每次调用都会基于当前列表全量元素实时统计 fun getElementCount(list: List<String>): Map<String, Int> { return list.groupingBy { it }.eachCount() } // 格式化打印统计结果 fun printCountResult(countMap: Map<String, Int>) { countMap.forEach { (key, count) -> println("$key size: $count") } }
使用示例:
// 初始统计 printCountResult(getElementCount(list)) /* 输出: A size: 3 B size: 2 C size: 1 */ // 新增元素 list.add("A") list.add("D") // 再次统计自动同步新内容 printCountResult(getElementCount(list)) /* 输出: A size: 4 B size: 2 C size: 1 D size: 1 */
方案2:自定义带计数能力的列表(适合大规模/高频操作场景)
重写列表增删逻辑,内部维护计数器,统计时无需遍历全表,性能更高:
class CountableArrayList<T> : ArrayList<T>() { // 内部维护元素计数映射 private val countMap = mutableMapOf<T, Int>() override fun add(element: T): Boolean { countMap[element] = countMap.getOrDefault(element, 0) + 1 return super.add(element) } override fun add(index: Int, element: T) { countMap[element] = countMap.getOrDefault(element, 0) + 1 super.add(index, element) } override fun addAll(elements: Collection<T>): Boolean { elements.forEach { countMap[it] = countMap.getOrDefault(it, 0) + 1 } return super.addAll(elements) } override fun addAll(index: Int, elements: Collection<T>): Boolean { elements.forEach { countMap[it] = countMap.getOrDefault(it, 0) + 1 } return super.addAll(index, elements) } override fun remove(element: T): Boolean { val result = super.remove(element) if (result) { val currentCount = countMap.getOrDefault(element, 0) if (currentCount > 1) { countMap[element] = currentCount - 1 } else { countMap.remove(element) } } return result } // 直接获取最新统计结果,时间复杂度O(1) fun getElementCount(): Map<T, Int> = countMap.toMap() // 直接打印统计结果 fun printElementCount() { countMap.forEach { (key, count) -> println("$key size: $count") } } }
使用示例:
// 初始化自定义列表 val list = CountableArrayList<String>().apply { addAll(listOf("A", "B", "C", "A", "A", "B")) } // 初始打印 list.printElementCount() /* 输出: A size: 3 B size: 2 C size: 1 */ // 新增元素 list.add("B") list.add("E") // 结果自动更新 list.printElementCount() /* 输出: A size: 3 B size: 3 C size: 1 E size: 1 */
内容的提问来源于stack exchange,提问作者Ticherhaz FreePalestine
相关产品推荐
相关产品推荐

