Scala如何从集合中提取指定类型元素并计算交集?
Scala 两个Set求交集的简洁高效实现
需求说明
你需要从存储(Long, Double)元组的firstSet中提取所有Long值,和Set[Long]类型的secondSet求交集,不需要编写嵌套条件语句就能实现。
基础简洁实现
直接通过map算子提取元组的第一个Long元素,再调用Scala Set内置的intersect方法即可:
val intersectResult: Set[Long] = firstSet.map(_._1).intersect(secondSet)
其中_._1是Scala访问元组第一个元素的语法糖,等价于完整写法tuple => tuple._1。
大集合场景优化实现
如果两个集合体量差异较大(比如secondSet远小于firstSet),可以直接过滤firstSet中的元素,省去生成全量Long中间集合的开销,性能更高:
val optimizedResult: Set[Long] = firstSet.collect { case (longVal, _) if secondSet.contains(longVal) => longVal }
两种方案的适用场景
- 基础实现逻辑简单易读,时间复杂度为
O(n + min(n,m)),n为firstSet大小,m为secondSet大小,适合两个集合体量接近的场景 - 优化实现仅需要遍历一次
firstSet,contains操作是Set的O(1)哈希查找,时间复杂度为O(n),适合firstSet体量远大于secondSet的场景
内容的提问来源于stack exchange,提问作者Dasph
相关产品推荐
相关产品推荐

