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 <T> Iterable<T>.any(): Boolean | 如果集合包含至少一个元素,则返回true |
fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean | 如果至少元素与给定的谓词匹配,则返回true |
fun <T> Iterable<T>.distinct(): List<T> | 返回一个列表,其中只包含给定集合中的不同元素 |
fun <T> Iterable<T>.drop(n: Int): List<T> | 返回一个列表,其中包含除前n个元素之外的所有元素 |
fun <T> Iterable<T>.elementAt(index: Int): T | 返回给定索引处的元素,或者如果集合中不存在给定索引则抛出IndexOutOfBoundException |
fun <T> Iterable<T>.elementAtOrElse(index: Int, defaultValue: (Int) -> T): T | 如果索引在当前集合中超出范围,它将返回给定索引处的元素或调用defaultValue函数的结果 |
fun <T : Comparable<T>> Iterable<T>.max(): T? | 返回最大的元素,如果集合中没有元素,则返回null |
fun <T : Comparable<T>> Iterable<T>.min(): T? | 返回最小的元素,如果集合中没有元素,则返回null |
fun <T> MutableCollection<out T>.remove(element: T): Boolean | 如果它存在于当前集合中,它将删除单个指定元素 |
fun <T> MutableCollection<out T>.removeAll(elements: Collection<T>): Boolean | 删除了包含在指定集合中的当前集合的所有元素。 |
fun <T> MutableCollection<out T>.retainAll(elements: Collection<T>): Boolean | 保留当前集合中包含在指定集合中的所有元素 |
fun <T> Iterable<T>.reversed(): List<T> | 以相反的顺序返回元素 |