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 教程。