仓颉编程语言基础集合类型详解:HashSet深度解析
文章目录
- 1. 基本特性与初始化
- 初始化方式:
- 2. 核心操作 元素遍历
- 3. 元素修改
- 4. 引用特性
- 5. 类型约束
- HashSet典型应用场景
- 性能优化建议
1. 基本特性与初始化
HashSet是仓颉语言中实现唯一元素集合的核心类型,具有以下特点:
- 元素唯一性:自动保证集合内无重复元素
- 无序存储:不保证元素的存储顺序与插入顺序一致
- 高性能查询:基于哈希表实现,查找时间复杂度接近O(1)
初始化方式:
import std.collection.*// 空集合
let set1 = HashSet<String>()
// 预分配容量
let set2 = HashSet<Int64>(100)
// 从数组初始化
let set3 = HashSet<Int64>([0, 1, 2])
// 使用生成函数
let set4 = HashSet<Int64>(10, {x: Int64 => (x * x)})
2. 核心操作 元素遍历
let mySet = HashSet<Int64>([3, 1, 2])
for (elem in mySet) {println("当前元素: ${elem}") // 输出顺序可能与插入顺序不同
}
存在性检查
println("包含元素2: ${mySet.contains(2)}") // 输出true
println("包含元素5: ${mySet.contains(5)}") // 输出false
获取集合大小
println("集合大小: ${mySet.size}") // 输出3
3. 元素修改
添加元素
mySet.add(4) // 成功添加
mySet.add(3) // 无效操作(已存在)
mySet.add(all: [5, 6, 6]) // 批量添加,自动去重
删除元素
mySet.remove(1) // 删除指定元素
4. 引用特性
HashSet是引用类型,多个变量引用同一实例时会共享修改:
let setA = HashSet<Int64>([1, 2, 3])
let setB = setA
setB.add(4)
println(setA) // 输出[1, 2, 3, 4]
5. 类型约束
HashSet的元素类型必须实现Hashable和Equatable接口:
// 合法类型
HashSet<Int64>([1, 2, 3])
HashSet<String>(["a", "b"])
// 非法类型(若自定义类型未实现接口)
// HashSet<MyClass>(...) // 编译错误
HashSet典型应用场景
数据去重:
let duplicates = [1, 1, 2, 3, 3]
let unique = collectHashSet(duplicates).toArray() // [1, 2, 3]
快速查找:
let userIDs = HashSet<Int64>([1001, 1002, 1003])
if (userIDs.contains(inputID)) {// 快速验证用户ID是否存在
}
集合运算:
let setA = HashSet([1, 2, 3])
let setB = HashSet([2, 3, 4])
let union = setA.union(setB) // 并集
let intersect = setA.intersect(setB) // 交集
性能优化建议
预分配空间:对于已知元素数量的集合,构造时指定初始容量。
选择合适的哈希对象:简单类型(如Int64/String)的哈希性能最佳。
避免频繁扩容:大规模数据插入前使用reserve方法预分配空间。
