- Kotlin 的 Collection 集合和 Set 集合的功能基本相同, Set 集合只是为Collection 集合增加了额外的限制:集合元素不允许重复
- 实际上 Kotlin 并没有真正为JVM平台实现任何 Set 集合类(只是通过别名借用了 Java 集合框架的类),因此不推荐通过构造器创建 Set 集合,而是推荐使用 Kotlin 提供的工具函数来创建 Set 集合 。
添加Set集合
Kotlin 提供了如下函数来创建 Set 集合。
setOf(): 返回一个不可变集合。该函数可以接受0或多个参数,作为集合的元素multableSetOf(): 返回一个可变集合。该函数可以接受0或多个参数,作为集合的元素。
注意事项:在Kotlin1.1中,上面两种方法实际返回的是LinkedHashSet实例,但从目前的实现来看,上面两个方法返回的 Set 集合都会记住元素的添加顺序一一这是LinkedHashSet的特征所决定的 。hashSetOf(): 该函数返回可变的HashSet集合。该函数可接受 0 个或多个参数,这些参数将作为集合的元素。linkedSetOf(): 该函数返回可变的LinkedHashSet集合。该函数可接受 0 个或多个参数,这些参数将作为集合的元素。sortedSetOf(): :该函数返回可变的TreeSet集合 。该函数可接受 0 个或多个参数,这些参数将作为集合 的元素 。
fun main(args: Array<String>) {
// 创建不可变集合,返回值是 Set
val set = setOf("Java", "Kotlin", "Go")
println(set) // 集合元素按添加顺序排列(实际上底层是 LinkedHashSet)
// 创建可变集合,返回值是 MutableSet
val mutableSet = mutableSetOf("Java", "Kotlin", "Go")
println(mutableSet) // 集合元素按添加顺序排列
println("setOf 的返回对象的实际类型:${set.javaClass}")
println("mutableSetOf 的返回对象的实际类型:${mutableSet.javaClass}")
// 创建 HashSet 集合
val hashSet = hashSetOf("Java", "Kotlin", "Go")
println(hashSet) // 不保证元素的顺序
// 创建 LinkedHashSet 集合
val linkedHashSet = linkedSetOf("Java", "Kotlin", "Go")
println(linkedHashSet) // 集合元素按添加顺序排列
// 创建 TreeSet 集合(需要通过 sortedSetOf)
val treeSet = sortedSetOf("Java", "Kotlin", "Go")
println(treeSet) // 集合元素按字典顺序(由小到大)排列
}
从上面的运行结果可以看出, Kotlin 的 4 个工具函数创建的 Set 集合都能维护元素的顺序,
- 其中
setOf()、mutableSetOf()、linkedSetOf()创建的Set集合能维护元素的添加顺序(这是LinkedHashSet的特征所决定的) sortedSetOf()函数创建的 Set 集合会按照大小对元素排序。- 如果真正希望 Set 集合不维护元素顺序,只有通过
hashSetOf()函数创建 Set 集合才行 。
使用Set方法
除 Java 原生 Set 的各种方法之外, Kotlin 的 Set 还扩展了大量方法,在 Set 集合中有很多方法与 Array 的方法功能相似
fun main() {
// 创建 Set,重复元素会自动去重
val set: Set<Int> = setOf(1, 2, 3, 4, 5, 5)
println("===== Java 原生 Set 方法 =====")
// 1. 是否包含某个元素
println("是否包含3: ${set.contains(3)}")
// 2. 集合大小
println("集合大小: ${set.size}")
// 3. 是否为空
println("集合是否为空: ${set.isEmpty()}")
// 4. 遍历元素
for (e in set) {
print("$e ")
}
println("\n")
println("===== Kotlin 扩展方法 =====")
// 1. map 映射
val squared = set.map { it * it }
println("平方结果: $squared")
// 2. filter 过滤
val evens = set.filter { it % 2 == 0 }
println("偶数元素: $evens")
// 3. sum 求和
println("元素总和: ${set.sum()}")
// 4. any 判断是否存在符合条件的元素
println("是否有大于4的元素: ${set.any { it > 4 }}")
// 5. all 判断是否所有元素都符合条件
println("是否所有元素都大于0: ${set.all { it > 0 }}")
// 6. none 判断是否没有符合条件的元素
println("是否没有小于0的元素: ${set.none { it < 0 }}")
// 7. maxOrNull / minOrNull 最大值最小值
println("最大值: ${set.maxOrNull()}")
println("最小值: ${set.minOrNull()}")
// 8. joinToString 转换为字符串
println("拼接字符串: ${set.joinToString(", ")}")
// 9. forEach 遍历
print("forEach 遍历: ")
set.forEach { print("$it ") }
println()
// 10. take/drop 截取
println("取前3个元素: ${set.take(3)}")
println("丢掉前2个元素: ${set.drop(2)}")
// 11. distinct 与 toList(虽然 Set 已经去重,但展示一致性)
println("转换为 List: ${set.toList()}")
}
集合运算
Kotlin 的集合在 集合运算 上也非常强大,直接提供了交集、并集、差集等方法,写起来比 Java 更简洁。
fun main() {
val setA = setOf(1, 2, 3, 4, 5)
val setB = setOf(4, 5, 6, 7, 8)
println("集合 A: $setA")
println("集合 B: $setB")
// 并集 union
val union = setA union setB
println("并集 A ∪ B: $union")
// 交集 intersect
val intersect = setA intersect setB
println("交集 A ∩ B: $intersect")
// 差集 subtract
val subtractAB = setA subtract setB
val subtractBA = setB subtract setA
println("差集 A - B: $subtractAB")
println("差集 B - A: $subtractBA")
// 对称差集(补集的一种形式)
val symmetricDiff = (setA union setB) subtract (setA intersect setB)
println("对称差集 A △ B: $symmetricDiff")
// 集合相加(转换为 List,再相加)
val plus = setA + setB
println("集合相加 A + B: $plus")
// 集合相减(删除公共元素)
val minus = setA - setB
println("集合相减 A - B: $minus")
}
1803

被折叠的 条评论
为什么被折叠?



