重学仓颉-10集合类型完全指南:从基础到高级应用

引言

在仓颉语言中,集合类型是处理数据集合的核心工具。本文将深入探讨仓颉语言提供的四种主要集合类型: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)  // 类型安全
}

参考资料

相关推荐
Bert丶seven4 小时前
鸿蒙Harmony实战开发教学(No.6)-Search组件基础到进阶篇
华为·harmonyos·arkts·鸿蒙·鸿蒙系统·arkui·开发教学
万少4 小时前
HarmonyOS6 应用升级经验分享
harmonyos
蓝冰印4 小时前
HarmonyOS Next 快速参考手册
linux·ubuntu·harmonyos
流影ng4 小时前
【HarmonyOS】并发线程间的通信
typescript·harmonyos
君逸臣劳7 小时前
【Harmony Next】手把手撸一个支持高度自定义的Toast
harmonyos
安卓开发者8 小时前
鸿蒙NEXT传感器开发概述:开启智能感知新时代
华为·harmonyos
安卓开发者21 小时前
鸿蒙NEXT按键拦截与监听开发指南
华为·harmonyos
2503_9284115621 小时前
10.13 Tabs选项卡布局
华为·harmonyos·鸿蒙
我爱学习_zwj1 天前
【鸿蒙进阶-7】鸿蒙与web混合开发
前端·华为·harmonyos
HMSCore1 天前
消息推送策略:如何在营销与用户体验间找到最佳平衡点
harmonyos