ZetCode

Kotlin Set 关键字

最后修改于 2025 年 4 月 19 日

Kotlin 的集合框架提供了强大的工具来处理唯一元素。 set 关键字和相关类型有助于管理无序的、不同项的集合。 本教程通过实际例子深入探讨了 set。

基本定义

Kotlin 中的 set 是一个无序的唯一元素的集合。 主要的 set 类型是 Set (只读) 和 MutableSet (可修改)。 Set 不允许重复元素,并且默认情况下不维护插入顺序。

创建一个基本的 Set

创建 set 的最简单方法是使用 setOf 函数。 这将创建一个不可变的 set,创建后无法修改。

BasicSet.kt
package com.zetcode

fun main() {

    val colors = setOf("Red", "Green", "Blue")
    println(colors) // Output: [Red, Green, Blue]
    
    val numbers = setOf(1, 2, 3, 2, 1)
    println(numbers) // Output: [1, 2, 3]
}

此示例显示了两个不可变的 set。 第二个 set 表明重复项会自动删除。 输出仅显示每个 set 中的唯一元素。

创建一个可变的 Set

对于可修改的 set,请使用 mutableSetOf。 这将创建一个 MutableSet,允许添加和删除元素。

MutableSet.kt
package com.zetcode

fun main() {

    val fruits = mutableSetOf("Apple", "Banana")
    fruits.add("Orange")
    fruits.remove("Apple")
    
    println(fruits) // Output: [Banana, Orange]
    println("Size: ${fruits.size}") // Output: Size: 2
}

在这里,我们创建一个可变的 set,并通过添加和删除元素来修改它。 size 属性显示了 set 中元素的当前数量。

HashSet 实现

Kotlin 提供了 hashSetOf 来创建一个 HashSet。 此实现为某些操作提供了更好的性能,但不维护顺序。

HashSetExample.kt
package com.zetcode

fun main() {

    val ids = hashSetOf(101, 102, 103, 104)
    println(ids) // Output order may vary
    
    ids.add(105)
    println(ids.contains(103)) // Output: true
    println(ids.first()) // Output: random element
}

此 HashSet 示例显示了无序存储。 contains 方法有效地检查元素是否存在。 first 方法返回一个任意元素。

集合操作

Kotlin set 支持数学 set 操作,如并集、交集和差集。 这些操作返回新的 set,而不会修改原始 set。

SetOperations.kt
package com.zetcode

fun main() {

    val setA = setOf(1, 2, 3, 4)
    val setB = setOf(3, 4, 5, 6)
    
    println(setA union setB) // Output: [1, 2, 3, 4, 5, 6]
    println(setA intersect setB) // Output: [3, 4]
    println(setA subtract setB) // Output: [1, 2]
}

这演示了三个基本的 set 操作。 并集组合了来自两个 set 的元素。 交集显示了共同的元素。 差集显示了第一个 set 中的元素,但不在第二个 set 中。

检查 Set 成员资格

Set 提供了检查元素存在的高效方法,可以使用 in 运算符或 contains 方法。

SetMembership.kt
package com.zetcode

fun main() {

    val vowels = setOf('a', 'e', 'i', 'o', 'u')
    
    println('a' in vowels) // Output: true
    println('x' in vowels) // Output: false
    println(vowels.contains('e')) // Output: true
    
    val testChars = setOf('a', 'b', 'c')
    println(vowels.containsAll(testChars)) // Output: false
}

该示例检查单个字符的成员资格,并测试另一个 set 的所有元素是否存在。 Set 针对这些成员资格测试进行了优化。

过滤和转换 Set

Set 支持类似其他集合的函数操作,如 filtermap。 这些操作返回新的 set。

SetTransforms.kt
package com.zetcode

fun main() {

    val numbers = setOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
    
    val evens = numbers.filter { it % 2 == 0 }
    println(evens) // Output: [2, 4, 6, 8]
    
    val squares = numbers.map { it * it }
    println(squares) // Output: [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    val smallSquares = numbers.map { it * it }
                            .filter { it < 20 }
    println(smallSquares) // Output: [1, 4, 9, 16]
}

这显示了过滤偶数、将数字映射到它们的平方以及链接操作。 请注意,结果仍然是具有唯一元素的 set。

排序的 Set

对于排序的 set,Kotlin 提供了 sortedSetOf,它以其自然顺序维护元素。 这在内部使用 TreeSet 实现。

SortedSetExample.kt
package com.zetcode

fun main() {

    val randomNumbers = sortedSetOf(5, 2, 8, 1, 7)
    println(randomNumbers) // Output: [1, 2, 5, 7, 8]
    
    val names = sortedSetOf("Zoe", "Alice", "Bob")
    println(names) // Output: [Alice, Bob, Zoe]
    
    val descending = sortedSetOf(compareByDescending { it.length }, "a", "bb", "ccc")
    println(descending) // Output: [ccc, bb, a]
}

前两个例子展示了数字和字符串的自然排序。 第三个演示了按字符串长度降序的自定义排序。

使用 Set 的最佳实践

来源

Kotlin 集合文档

本教程深入探讨了 Kotlin 的 set 功能,展示了不可变 set 和可变 set。 我们探讨了各种实现和操作。 Set 是在 Kotlin 应用程序中处理唯一元素的强大工具。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有多年的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1400 多篇文章和 8 本电子书。 我有超过八年的编程教学经验。

列出 所有 Kotlin 教程