驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
kotlin中差集、交集、并集方法汇总
/  

kotlin中差集、交集、并集方法汇总

开篇

Kotlin 原生支持 集合的几种操作,分别是:交集、差集、并集。

非常有用的功能,这里我简单做一个总结。

正文

交集

的意思是,2个集合共同拥有的部分,kotlin提供了 中缀表达式和普通的函数方法调用。

    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)
    }

结果是:

true
[2]

其中o1 intersect o2是中缀表达式,很强大的东西,有兴趣的同学可以去了解下,从语义上来讲,我觉得比方法调用更加直观

并集

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

    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)
    }

结果为:

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

其中o1+o2是对+进行了重载,通过 IDE 可以点击过去查看其实现:

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)进行了符号重载,学过 C++的应该很明白这种用法。传统的 Java可是没有这个利器的。

差集

差集的定义简单来讲,就是元素存在于集合 A中而不存在于 B中。也可以理解为:A集合排除(A和 B 的交集)

直接上代码

    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)
    }

结果

true
true
[1, 4]
[1, 4]

也是有 3 种表达的方式:符号重载、中缀表达式、普通方法调用。

结语

进了 kotlin 的门,你还出的去吗?

骐骥一跃,不能十步。驽马十驾,功在不舍。