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

Kotlin:统计列表中枚举类型属性的不同值数量

Kotlin统计列表中不同属性值的数量

内置方法实现

Kotlin标准库已经提供了简洁的内置方式来实现这个需求,不需要自定义扩展函数。核心思路是提取目标属性后利用集合的去重特性统计数量:

  1. 最直观的写法:
// 假设你的Class列表为classes
val uniqueDayCount = classes.map { it.dayOfWeek }.distinct().size

map提取所有dayOfWeek属性,distinct()去重得到唯一值列表,最后size就是不同星期的数量。

  1. 更高效的写法:
    如果数据量较大,推荐用mapTo直接将属性存入HashSet(自动去重,且判断元素存在的时间复杂度为O(1)),避免distinct()额外创建中间列表:
val uniqueDayCount = classes.mapTo(HashSet()) { it.dayOfWeek }.size

自定义扩展函数的优化

你编写的扩展函数可以正常工作,但有几个可以优化的点:

  • 无需单独维护count变量,集合的size就是最终统计数
  • ArrayList.contains()的时间复杂度是O(n),换成HashSet能大幅提升性能
  • 空集合的判断是冗余的,空迭代器不会进入循环,最终集合size自然为0

优化后的扩展函数可以更简洁高效:

inline fun <T, P> Iterable<T>.countUnique(block: (T) -> P): Int =
    mapTo(HashSet(), block).size

或者用函数式风格的fold实现:

inline fun <T, P> Iterable<T>.countUnique(block: (T) -> P): Int {
    return fold(HashSet<P>()) { set, element ->
        set.apply { add(block(element)) }
    }.size
}

内容的提问来源于stack exchange,提问作者Leonardo Sibela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:20:15