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

参考资料

相关推荐
小喷友6 小时前
第9章 鸿蒙微内核与系统架构
前端·app·harmonyos
HarderCoder7 小时前
重学仓颉-9扩展系统完全指南:从基础概念到高级应用
harmonyos
HarmonyOS_SDK8 小时前
让集成更安心,让连接更高效:鸿蒙生态伙伴SDK优选库双端赋能
harmonyos
被开发耽误的大厨14 小时前
鸿蒙ArkTS 核心篇-13-if分支语句
华为·harmonyos·鸿蒙
爱笑的眼睛1116 小时前
HarmonyOS Router 基本使用详解:从代码示例到实战要点
华为·harmonyos
Points1 天前
开源项目:OpenHarmony WMA音频解码器
harmonyos·音视频开发
bdawn1 天前
深入解析HarmonyOS:UIAbility与Page的生命周期协同
华为·生命周期·harmonyos·page·uiability·oncreate·ondidbuild
安卓开发者1 天前
鸿蒙NEXT布局全解析:从线性到瀑布流,构建自适应UI界面
ui·华为·harmonyos
小星7401 天前
鸿蒙服务端开发资料汇总
华为·wpf·harmonyos