kotlin中集合的交集、并集、差集

前言

最近在项目上用到了kotlin的差集,然后来了解以下kotlin 集合的交集、并集、差集,都是kotlin原生支持的几种操作

交集

2个集中中共同的部分,kotlin提供了 中缀表达式和普通的函数方法调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val o1 = setOf(1, 2, 4)
var o2 = setOf(2, 3, 6)

/**
* 交集
*/
@Test
fun testIntersect() {
val i1 = o1 intersect o2
val i2 = o1.intersect(o2)
println(i1 == i2)
println(i1)
}

运行结果

1
2
true
[2]

其中o1 intersect o2是中缀表达式,这是kotlin中比较强大的一部分,看起来更直观

并集

并集就是将多个集合合并后去重,kotlin 提供了 3 种方法获取:中缀表达式、方法符重载、普通方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  val o1 = setOf(1, 2, 4)
var o2 = setOf(2, 3, 6)
/**
* 并集
*/
@Test
fun testUnion() {
val u1 = o1 + o2
val u2 = o1 union o2
var u3 = o1.union(o2)

println(u1 == u2)
println(u1 == u3)
println(u2)
}

运行结果

1
2
3
true
true
[1, 2, 4, 3, 6]

其中o1+o2是对+进行了重载,查看其源码:

1
2
3
4
5
6
public operator fun <T> Set<T>.plus(elements: Iterable<T>): Set<T> {
val result = LinkedHashSet<T>(mapCapacity(elements.collectionSizeOrNull()?.let { this.size + it } ?: this.size * 2))
result.addAll(this)
result.addAll(elements)
return result
}

这个就是通过扩展函数对+(plus)进行了符号重载,使用更方便,好记

差集

差集就是元素存在于集合 A中而不存在于 B中。也可以理解为:A集合排除(A和 B 的交集),也是3 种方式:符号重载、中缀表达式、普通方法调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
val o1 = setOf(1, 2, 4)
var o2 = setOf(2, 3, 6)
/**
* 差集
*/
@Test
fun testSubtract() {
val s1 = o1 - o2
val s2 = o1.subtract(o2)
val s3 = o1 subtract o2
println(s1 == s2)
println(s3 == s2)
println(s3)
println(s3)
}

运行结果

1
2
3
4
true
true
[1, 4]
[1, 4]
结语

可以看出来kotlin的语法糖还是比较强大的,比java强大多了,再也不用java了,如果用java,还得自己封装这三个函数,kotlin最简单的符号重载(+、-)是最强大的,语义上也是最好理解的