引言
在仓颉语言中,集合类型是处理数据集合的核心工具。本文将深入探讨仓颉语言提供的四种主要集合类型:Array、ArrayList、HashSet 和 HashMap。
集合类型概览
类型名称 | 元素可变 | 增删元素 | 元素唯一性 | 有序序列 |
---|---|---|---|---|
Array<T> |
Y | N | N | Y |
ArrayList<T> |
Y | Y | N | Y |
HashSet<T> |
N | Y | Y | N |
HashMap<K, V> |
K: N, V: Y | Y | K: Y, V: N | N |
1. ArrayList - 动态数组
1.1 基本概念
ArrayList 是仓颉语言中最灵活的集合类型,支持动态增删改查操作。
1.2 导入和构造
cangjie
import std.collection.*
// 多种构造方式
let emptyList = ArrayList<String>()
let capacityList = ArrayList<String>(100)
let fromArray = ArrayList<Int64>([1, 2, 3, 4, 5])
let ruleBased = ArrayList<String>(3, {x: Int64 => "Item ${x}"})
1.3 基本操作
cangjie
import std.collection.ArrayList
main() {
let list = ArrayList<Int64>()
// 添加元素
list.add(10)
list.add(20)
list.add(30)
// 访问元素
println("第一个元素: ${list[0]}")
println("列表大小: ${list.size}")
// 修改元素
list[0] = 100
// 删除元素
list.remove(at: 1)
// 遍历
for (item in list) {
println("元素: ${item}")
}
}
2. HashMap - 键值对映射
2.1 基本概念
HashMap 用于存储键值对映射关系,基于哈希表实现快速查找。
2.2 构造和操作
cangjie
import std.collection.HashMap
main(): Unit {
let scores = HashMap<String, Int64>()
// 添加键值对
scores.add("张三", 85)
scores.add("李四", 92)
scores["王五"] = 78
// 访问值
if (scores.contains("张三")) {
println("张三的分数: ${scores["张三"]}")
}
// 遍历
for ((name, score) in scores) {
println("${name}: ${score}")
}
// 删除
scores.remove("李四")
}
3. HashSet - 唯一元素集合
3.1 基本概念
HashSet 确保集合中每个元素都是唯一的,基于哈希表实现。
3.2 使用示例
cangjie
import std.collection.HashSet
main() {
let uniqueNumbers = HashSet<Int64>()
// 添加元素(自动去重)
uniqueNumbers.add(1)
uniqueNumbers.add(2)
uniqueNumbers.add(1) // 不会重复添加
// 检查元素存在性
if (uniqueNumbers.contains(1)) {
println("1 存在于集合中")
}
// 遍历
for (num in uniqueNumbers) {
println("唯一数字: ${num}")
}
}
4. 集合的迭代
4.1 Iterable 接口
所有集合类型都实现了 Iterable<T>
接口:
cangjie
interface Iterable<T> {
func iterator(): Iterator<T>
}
interface Iterator<T> <: Iterable<T> {
mut func next(): Option<T>
}
4.2 for-in 循环
cangjie
import std.collection.*
main() {
let list = [1, 2, 3, 4, 5]
// for-in 循环(推荐)
for (item in list) {
println("项目: ${item}")
}
// 等价的 while 循环
var iterator = list.iterator()
while (let Some(item) <- iterator.next()) {
println("项目: ${item}")
}
}
5. 选择策略
5.1 性能特征
- Array: 固定大小,O(1) 随机访问
- ArrayList: 动态大小,O(1) 末尾操作,O(n) 中间操作
- HashSet: O(1) 平均查找和插入
- HashMap: O(1) 平均查找、插入和删除
5.2 选择指南
- 固定大小,频繁访问: Array
- 动态大小,频繁增删: ArrayList
- 需要元素唯一性: HashSet
- 键值对映射: HashMap
6. 最佳实践
6.1 性能优化
cangjie
import std.collection.*
main() {
// 预分配容量
let largeList = ArrayList<Int64>(10000)
// 批量操作
let batchData = [1, 2, 3, 4, 5]
largeList.add(all: batchData)
}
6.2 类型安全
cangjie
import std.collection.*
func processNumbers(list: ArrayList<Int64>) {
for (num in list) {
println("数字: ${num}, 平方: ${num * num}")
}
}
main() {
let numbers = ArrayList<Int64>([1, 2, 3, 4, 5])
processNumbers(numbers) // 类型安全
}