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

Kotlin如何检查集合恰好包含另一个集合的所有元素及对应频次

Kotlin 带次数匹配的集合包含判断实现方案

结论

Kotlin 标准库没有内置满足「元素出现次数完全匹配要求」的包含判断方法,你可以通过自定义扩展方法实现该需求。

实现思路

  • 提前边界校验:如果待匹配集合的元素总个数大于原集合,直接返回false,避免无效计算
  • 统计原集合所有元素的出现频率,生成可变频率映射表
  • 遍历待匹配集合的每一个元素:
    • 若元素在频率表中不存在或剩余计数为0,直接返回false
    • 否则将对应元素的剩余计数减1
  • 待匹配集合所有元素遍历完成后,返回true

完整代码实现

fun <T> Iterable<T>.containsAllExact(other: Iterable<T>): Boolean {
    // 提前判断容量边界
    val sourceSize = if (this is Collection<T>) size else count()
    val targetSize = if (other is Collection<T>) other.size else other.count()
    if (targetSize > sourceSize) return false

    // 统计原集合元素频率
    val frequencyMap = groupingBy { it }.eachCount().toMutableMap()
    // 遍历校验待匹配集合元素
    for (element in other) {
        val currentCount = frequencyMap.getOrDefault(element, 0)
        if (currentCount == 0) return false
        frequencyMap[element] = currentCount - 1
    }
    return true
}

效果验证

不符合预期场景(返回false)

data class Person(val name: String, val age: Int)

val a = listOf(Person("Alice", 10), Person("Bob", 13))
val b = listOf(Person("Alice", 10), Person("Alice", 10))

fun main() {
   println(a.containsAllExact(b)) // 输出 false
}

符合预期场景(返回true)

data class Person(val name: String, val age: Int)

val a = listOf(Person("Alice", 10), Person("Alice", 10), Person("Bob", 13))
val b = listOf(Person("Alice", 10), Person("Alice", 10))

fun main() {
   println(a.containsAllExact(b)) // 输出 true
}

内容的提问来源于stack exchange,提问作者Matthew Layton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:06:04