You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 18:54:02