6.2 集合类型之Set、MutableSet

本文介绍了Kotlin中的Set集合,包括通过setOf创建不可变Set,以及Set集合间的子集、父集、交集、差集和并集操作。接着详细讲解了MutableSet,展示了其声明与创建,以及与MutableList相似的可变特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Kotlin的集合分为两大类:可变集合和不可变集合,对于Set集合来说,就分为不可变的Set以及可变的MutableSet。

Kotlin的List集合和Set集合的功能基本相同,Set集合只是为List集合增加了额外的限制:集合元素不允许重复。

Set集合

声明和创建

通过setOf创建不可变Set,setOf提供了3个重载函数来创建,我们根据源码来一一分析:

-setOf(): 创建一个空的Set
源码:

/**
 * Returns an empty read-only set.  The returned set is serializable (JVM).
 * @sample samples.collections.Collections.Sets.emptyReadOnlySet
 */
@kotlin.internal.InlineOnly
public inline fun <T> setOf(): Set<T> = emptySet()
  • setOf(element: T): 创建一个元素只有一个的Set
/**
 * Returns an immutable set containing only the specified object [element].
 * The returned set is serializable.
 */
public fun <T> setOf(element: T): Set<T> = java.util.Collections.singleton(element)
  • setOf(vararg elements: T): 创建含有多个元素的Set
/**
 * Returns a new read-only set with the given elements.
 * Elements of the set are iterated in the order they were specified.
 * The returned set is serializable (JVM).
 * @sample samples.collections.Collections.Sets.readOnlySet
 */
public fun <T> setOf(vararg elements: T): Set<T> = if (elements.size > 0) elements.toSet() else emptySet()

例:

fun main(args: Array<String>) {
    val numSetNull = setOf<Int>()
    val numSetOne = setOf("hello")
    val numSetMul = setOf("Alfred", 29, "男")

    println(numSetNull)
    println(numSetOne)
    println(numSetMul)
}

结果:

[]
[hello]
[Alfred, 29,]
Set集合间的运算关系
containsAll(elements: Collection): 判断子集父集

A、B两个集合,如果A的所有元素在B中,A是B的子集,B是A的父集。
例:

fun main(args: Array<String>) {
    val num1 = setOf(1, 2, 3, 4)
    val num2 = setOf(4, 5, 6, 2, 7, 8, 9, 0, 3, 1)
    println(num2.containsAll(num1))
}

结果:true

intersect 取两个集合的交集

AB两个集合,取两个集合都包含的元素组成新的集合:

fun main(args: Array<String>) {
    val num1 = setOf(1, 2, 3, 4, -3)
    val num2 = setOf(4, 5, 6, 2, 7, 8, 9, 0, 3, 1)
    println(num1.intersect(num2))
}

结果:[1, 2, 3, 4]

subtract取两个集合的差集

AB两个集合,将A中AB公共元素去掉剩余元素组成的集合,或将B中AB公共的元素去掉剩余元素组成的集合:
例:

fun main(args: Array<String>) {
    val num1 = setOf(1, 2, 3, 4, -3)
    val num2 = setOf(4, 5, 6, 2, 7, 8, 9, 0, 3, 1)
    println(num1.subtract(num2))
    println(num2.subtract(num1))
}

结果:

[-3]
[5, 6, 7, 8, 9, 0]
union 并集

将AB两个集合所有元素,融合在一个集合中,并去重。
例:

fun main(args: Array<String>) {
    val num1 = setOf(1, 2, 3, 4, -3)
    val num2 = setOf(4, 5, 6, 2, 7, 8, 9, 0, 3, 1)
    println(num1.union(num2))
}

结果:[1, 2, 3, 4, -3, 5, 6, 7, 8, 9, 0]

注意:Set集合的常规方法 如:sum()、count()、size、contains、filter等方法不再赘述。

MutableSet

MutableSet与MutableList相似,是可变的集合。

MutableSet的声明与创建
  • mutableSetOf():创建空的MutableSet
    源码:
/**
 * Returns an empty new [MutableSet].
 *
 * The returned set preserves the element iteration order.
 * @sample samples.collections.Collections.Sets.emptyMutableSet
 */
@SinceKotlin("1.1")
@kotlin.internal.InlineOnly
public inline fun <T> mutableSetOf(): MutableSet<T> = LinkedHashSet()
  • mutableSetOf(vararg elements: T):创建包含多个元素的MutableSet
/**
 * Returns a new [MutableSet] with the given elements.
 * Elements of the set are iterated in the order they were specified.
 * @sample samples.collections.Collections.Sets.mutableSet
 */
public fun <T> mutableSetOf(vararg elements: T): MutableSet<T> = elements.toCollection(LinkedHashSet(mapCapacity(elements.size)))

例:

fun main(args: Array<String>) {
    val num1 = mutableSetOf<Int>()
    val num2 = mutableSetOf("Alfred", 29, "男")

    println(num1)
    println(num2)
}

结果:

[]
[Alfred, 29,]
MutableSet常用方法

MutableSet常用方法就不再一一列举了,可以参考MutableList中的介绍以及实例。

属性描述
fun add(element: E): Boolean将给定元素添加到集合中
fun addAll(elements: Collection< E>): Boolean将给定集合的所有元素添加到当前集合中
fun clear()将删除此集合中的所有元素
fun iterator(): MutableIterator< E>它返回此对象元素的迭代器
fun remove(element: E): Boolean如果指定元素存在于集合中,将从此集合中删除单个指定元素
fun removeAll(elements: Collection< E>): Boolean会删除集合中指定的当前集合中的所有元素
fun retainAll(elements: Collection< E>): Boolean仅保留当前集合中存在于指定集合中的那些元素
fun contains(element: E): Boolean检查当前集合中是否包含的指定元素
fun containsAll(elements: Collection< E>): Boolean检查当前集合中是否存在指定集合的所有元素
fun isEmpty(): Boolean如果集合为空(不包含任何元素),则返回true,否则返回false
fun Iterable.any(): Boolean如果集合包含至少一个元素,则返回true
fun Iterable.any(predicate: (T) -> Boolean): Boolean如果至少元素与给定的谓词匹配,则返回true
fun Iterable.distinct(): List返回一个列表,其中只包含给定集合中的不同元素
fun Iterable.drop(n: Int): List返回一个列表,其中包含除前n个元素之外的所有元素
fun Iterable.elementAt(index: Int): T返回给定索引处的元素,或者如果集合中不存在给定索引则抛出IndexOutOfBoundException
fun Iterable.elementAtOrElse(index: Int, defaultValue: (Int) -> T): T如果索引在当前集合中超出范围,它将返回给定索引处的元素或调用defaultValue函数的结果
fun <T : Comparable> Iterable.max(): T?返回最大的元素,如果集合中没有元素,则返回null
fun <T : Comparable> Iterable.min(): T?返回最小的元素,如果集合中没有元素,则返回null
fun MutableCollection.remove(element: T): Boolean如果它存在于当前集合中,它将删除单个指定元素
fun MutableCollection.removeAll(elements: Collection): Boolean删除了包含在指定集合中的当前集合的所有元素。
fun MutableCollection.retainAll(elements: Collection): Boolean保留当前集合中包含在指定集合中的所有元素
fun Iterable.reversed(): List以相反的顺序返回元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alfred Gao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值