重学仓颉-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)  // 类型安全
}

参考资料

相关推荐
不羁的木木8 小时前
Form Kit(卡片开发服务)学习笔记01-核心概念与架构设计
笔记·学习·harmonyos
不羁的木木8 小时前
ArkWeb实战学习笔记01-核心概念与架构设计
笔记·学习·harmonyos
Goway_Hui9 小时前
【鸿蒙原生应用开发--ArkUI--010】Recipe-app 菜谱应用开发教程
华为·harmonyos
●VON9 小时前
鸿蒙 BodyAR 实战:基于人体骨骼追踪的体感运动计数器开发全解
华为·ar·harmonyos·鸿蒙·新特性
Davina_yu9 小时前
页面路由导航:Router与Navigation组件的跳转传参(7)
harmonyos·鸿蒙·鸿蒙系统
Ww.xh10 小时前
鸿蒙WebView IPC防伪造请求方案
华为·harmonyos
大雷神12 小时前
第25篇|Surface 预览控制:ArkUI 页面如何接住相机画面
harmonyos
大雷神12 小时前
第24篇|相机权限和设备枚举:先判断能力再打开预览
harmonyos
Goway_Hui12 小时前
【鸿蒙原生应用开发--ArkUI--003】TodoApp - 待办事项应用教程
华为·harmonyos
想你依然心痛12 小时前
HarmonyOS 6(API 23)智能体驱动的沉浸式AR航天器装配工坊
华为·ar·harmonyos·智能体