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
相关产品推荐
相关产品推荐

