Kotlin Set 关键字
最后修改于 2025 年 4 月 19 日
Kotlin 的集合框架提供了强大的工具来处理唯一元素。 set
关键字和相关类型有助于管理无序的、不同项的集合。 本教程通过实际例子深入探讨了 set。
基本定义
Kotlin 中的 set 是一个无序的唯一元素的集合。 主要的 set 类型是 Set
(只读) 和 MutableSet
(可修改)。 Set 不允许重复元素,并且默认情况下不维护插入顺序。
创建一个基本的 Set
创建 set 的最简单方法是使用 setOf
函数。 这将创建一个不可变的 set,创建后无法修改。
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
,允许添加和删除元素。
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
。 此实现为某些操作提供了更好的性能,但不维护顺序。
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。
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
方法。
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 支持类似其他集合的函数操作,如 filter
和 map
。 这些操作返回新的 set。
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 实现。
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 的最佳实践
- 选择正确的类型: 默认使用不可变的 set,仅在需要时使用可变 set。
- 考虑性能: 在一般情况下使用 HashSet,在排序很重要时使用 TreeSet。
- 利用 set 操作: 使用内置操作,如并集和交集,以获得更简洁的代码。
- 有效地检查成员资格: 使用
in
或contains
进行快速查找。 - 注意排序: 请记住,大多数 set 不维护插入顺序,除非使用 LinkedHashSet。
来源
本教程深入探讨了 Kotlin 的 set
功能,展示了不可变 set 和可变 set。 我们探讨了各种实现和操作。 Set 是在 Kotlin 应用程序中处理唯一元素的强大工具。
作者
列出 所有 Kotlin 教程。