「Mac玩转仓颉内测版29」基础篇9 - 数组类型详解

本篇将介绍 Cangjie 中的数组类型,包括数组的定义、创建、访问、常见操作以及在数据管理中的应用,帮助开发者熟练掌握数组的使用。


关键词
  • 数组类型定义
  • 数组创建
  • 数组访问
  • 数组操作
  • 应用场景

一、数组类型概述

在 Cangjie 中,数组是一种用于存储同类型数据的集合。数组中的元素按顺序排列,每个元素都有唯一的索引,索引从 0 开始。数组在处理大量数据时十分高效,适合用作列表、数据集等。

数组是一种引用类型,当你将一个数组赋值给另一个变量时,它们指向相同的内存地址。因此修改其中一个变量,会影响另一个。

示例

let numbers: Array<Int64> = [1, 2, 3, 4, 5]
println(numbers)

输出:

[1, 2, 3, 4, 5]

二、创建数组

可以使用方括号 [] 创建数组,并指定数组元素的类型。还可以创建空数组并在后续添加元素。需要注意的是,数组的长度在创建时是固定的,不能动态扩展或缩减。

示例

// 初始化带有元素的数组
let fruits: Array<String> = ["Apple", "Banana", "Cherry"]

// 创建空数组
var emptyArray: Array<Int64> = []
println(fruits)
println(emptyArray)

输出:

["Apple", "Banana", "Cherry"]
[]

三、数组的访问

数组中的元素可以通过索引来访问。使用方括号 [] 指定索引值,即可访问或修改指定位置的元素。需要注意,访问数组时,索引必须在合法范围内(0 到 size-1),否则会抛出异常。

示例

let fruits: Array<String> = ["Apple", "Banana", "Cherry"]

println("第一个元素: ${fruits[0]}")  // 输出: 第一个元素: Apple
println("第二个元素: ${fruits[1]}")  // 输出: 第二个元素: Banana

输出:

第一个元素: Apple
第二个元素: Banana

常见错误处理

let fruits: Array<String> = ["Apple", "Banana", "Cherry"]
let index: Int64 = 3

if (index >= 0 && index < fruits.size) {
    println("第${index}个元素是${fruits[index]}")
} else {
    println("索引超出范围")
}

四、数组的常见操作

在 Cangjie 中,数组是固定长度的集合,因此不支持直接添加或删除元素的操作,但可以通过下标访问来修改数组中的元素。

  1. 修改数组元素:使用下标访问语法 [] 来直接修改指定位置的元素。
  2. 获取数组长度:使用 size 属性获取数组的元素个数。

示例

var numbers: Array<Int64> = [1, 2, 3, 4, 5]

// 修改元素
numbers[0] = 10
println("修改后: ${numbers}") // 输出: 修改后: [10, 2, 3, 4, 5]

// 获取数组长度
println("数组长度: ${numbers.size}") // 输出: 数组长度: 5

输出:

修改后: [10, 2, 3, 4, 5]
数组长度: 5

五、值类型数组 VArray

Cangjie 中的 VArray 是一种特殊的值类型数组,用于处理固定长度的数组。与普通数组不同,VArray 不允许在运行时修改其长度,且只能容纳值类型的元素。

  1. 通过重复值创建:使用 repeat 参数可以创建一个包含重复值的 VArray
  2. 通过初始化函数创建:使用初始化函数根据索引值创建数组的每个元素。

示例

// 创建一个包含6个元素的VArray,所有元素初始化为0
let repeatArray: VArray<Int64, $6> = VArray<Int64, $6>(repeat: 0)
println(repeatArray.size)

// 使用初始化函数创建一个VArray,元素值为索引值
let initArray: VArray<Int64, $6> = VArray<Int64, $6>({ i => i + 1 })
for (i in 0..6) {
    println(initArray[i])
}

输出:

6
1
2
3
4
5
6

VArray 的访问

与普通数组类似,VArray 也可以通过下标语法访问和修改元素。其长度可以通过 size 属性获取。

var a: VArray<Int64, $3> = [1, 2, 3]
let firstElement = a[0] // 获取第一个元素
println("第一个元素: ${firstElement}") // 输出: 第一个元素: 1

println(a[2]) // 输出: 3
a[2] = 5 // 修改第三个元素
println(a[2]) // 输出: 5

六、数组的应用场景

数组在 Cangjie 中广泛应用,适合存储和管理有序的数据,以下是一些典型应用场景:

6.1 数据列表

数组可以用于保存一系列信息,如商品名称、用户数据等。

示例

let scores: Array<Int64> = [85, 90, 78, 92, 88]
var total: Int64 = 0

for (score in scores) {
    total += score
}

let average: Float64 = Float64(total / scores.size)
println("平均分: ${average}")  // 输出: 平均分: 86.000000

输出:

平均分: 86.000000
6.2 批量操作

可以使用数组执行批量操作,例如遍历、筛选和统计。批量操作在处理大规模数据时尤为有用。


七、性能优化建议

在处理大量数据时,数组的性能优势明显。然而需要注意,频繁的数组操作可能会影响性能。因此,建议在需要动态增删元素时使用其他数据结构(如列表)。

对于固定大小的数据集,推荐使用 VArray,它是值类型数组,性能更加优越,适合需要高效数据访问的场景。

示例

let fixedArray: VArray<Int64, $5> = [1, 2, 3, 4, 5]
println(fixedArray[3]) // 输出: 4

小结

本篇介绍了 Cangjie 中的数组类型,涵盖了数组的定义、创建、访问、操作及应用场景,帮助开发者熟练掌握数组的基本用法和数据处理。特别是 VArray 作为值类型数组,适用于需要固定长度、高效数据访问的场景。


下篇预告

下一篇将介绍 Cangjie 的 区间类型,讲解区间的定义、操作方法及在数据遍历和判断中的应用,敬请关注 「Mac玩转仓颉内测版30」基础篇10 - 区间类型详解


上一篇: 「Mac玩转仓颉内测版28」基础篇8 - 元组类型详解
下一篇: 「Mac玩转仓颉内测版30」基础篇10 - 区间类型详解

作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=231
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YonBuilder移动开发鸿蒙版本编译教程

0.YonBuilder移动开发应用详情页访问路径 登录用友开发者中心&#xff0c;鼠标悬浮右上角昵称处&#xff0c;点击「工作台」进入「开发者中心工作台」 「开发者中心工作台」页面点击左侧竖直菜单面板中「移动应用开发」后&#xff0c;选择右侧页面内的目标应用&#xff0c;即可…

kafka进阶_3.消费消息

文章目录 一、消费消息概览1.1、基本代码1.2、消费过程 二、消费者组2.1、push & pull2.2、消费者组 三、调度器Coordinator四、消费者分配策略五、偏移量offset5.1、起始偏移量5.2、指定偏移量消费5.3、偏移量提交5.3.1、自动提交5.3.2、手动提交 5.4、偏移量的保存 六、消…

(笔记,自己可见_1)简单了解ZYNQ

1、zynq首先是一个片上操作系统&#xff08;Soc&#xff09;&#xff0c;结合了arm&#xff08;PS&#xff09;和fpga&#xff08;PL&#xff09;两部分组成 Zynq系统主要由两部分组成&#xff1a;PS&#xff08;Processing System&#xff09;和PL&#xff08;Programmable L…

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…

【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么?

博客主页&#xff1a; [青松] 本文专栏: NLP 大模型百面百过 【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方&#xff1f;为什么&#xff1f; 重要性&#xff1a;★★★ &#x1f4af; 本题主要考察面试者对以下问题的理解&#xff1a; ① 数据特征和模…

JWT加解密应用方案设计与实现

为什么要用令牌技术&#xff1f; 这个问题其实问的就是Cookice、Session、Token(令牌)之间的区别了。 首先&#xff0c;存放的位置做一下比较&#xff0c;Cookice小饼干存放在客户端的浏览器当中&#xff0c;Session会话存放在服务器线程当中(本质上还是需要利用Cookice实现)…

数据集-目标检测系列- 安全背心 检测数据集 safety_vests >> DataBall

数据集-目标检测系列- 安全背心 检测数据集 safety DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 贵在坚持&#xff01; 数据样例项目地址&#xff1a; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gi…

C语言菜鸟入门·关键字·int的用法

目录 1. int关键字 1.1 取值范围 1.2 符号类型 1.3 运算 1.3.1 加法运算() 1.3.2 减法运算(-) 1.3.3 乘法运算(*) 1.3.4 除法运算(/) 1.3.5 取余运算(%) 1.3.6 自增()与自减(--) 1.3.7 位运算 2. 更多关键字 1. int关键字 int 是一个关键字&#xff0…

unity中:超低入门级显卡、集显(功耗30W以下)运行unity URP管线输出的webgl程序有那些地方可以大幅优化帧率

删除Global Volume&#xff1a; 删除Global Volume是一项简单且高效的优化措施。实测表明&#xff0c;这一改动可以显著提升帧率&#xff0c;甚至能够将原本无法流畅运行的场景变得可用。 更改前的效果&#xff1a; 更改后的效果&#xff1a; 优化阴影和材质&#xff1a; …

Vue + Websocket播放PCM(base64转ArrayBuffer、 字符串转ArrayBuffer)

文章目录 引言I 音视频处理相关概念和APIII 案例:基于开源库 pcm-player方式播放借助MediaSource和Audio对象播放音频流。基于原生api AudioContext 播放操作III 格式转换js字符串转ArrayBufferbase64 转 ArrayBufferIV 解决pcm-player分片播放问题引言 需求: 基于webscoket传…

【JavaEE进阶】SpringBoot 快速上⼿

了解Maven,并配置国内源 使⽤SpringBoot创建⼀个项⽬, 输出HelloWorld 一、Maven 1.什么是Maven 官⽅对于Maven的描述: Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can man…

QT QFormLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例&#xff0c;包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizonta…

PCA算法所体现的核心数学思维

一、PCA算法的基本思想 PCA算法的核心思想是通过线性变换&#xff0c;将数据从原始的高维空间投影到低维空间&#xff0c;同时尽可能保留数据的主要变异性。这种变换是通过找到一组新的坐标轴&#xff08;即主成分&#xff09;来实现的&#xff0c;这些坐标轴是原始数据空间的…

如何解决pdf.js跨域从url动态加载pdf文档

摘要 当我们想用PDF.js从URL加载文档时&#xff0c;将会因遇到跨域问题而中断&#xff0c;且是因为会触发了PDF.js和浏览器的双重CORS block&#xff0c;这篇文章将会介绍&#xff1a;①如何禁用pdf.js的跨域&#xff1f;②如何绕过浏览器的CORS加载URL文件&#xff1f;②如何使…

C语言数据结构——详细讲解 双链表

从单链表到双链表&#xff1a;数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作&#xff08;一&#xff09;双链表的尾插操作&#xff08;二&a…

Java小白成长记(创作笔记二)

目录 序言 思维导图 续 用户登录/注册 数据表 实体层 持久层 服务层 认证与授权 整合springsecurity controller注册测试 controller登录测试 跨域解决 方法 Java小白成长记&#xff08;创作笔记一&#xff09; Java小白成长记&#xff08;创作笔记二&#xff09;…

案例研究|阿特斯的JumpServer分布式部署和多组织管理实践

苏州阿特斯阳光电力科技有限公司&#xff08;以下简称为阿特斯&#xff09;是一家集太阳能光伏组件制造和为全球客户提供太阳能应用产品研发、设计、制造、销售的专业公司。 阿特斯集团总部位于加拿大&#xff0c;中国区总部位于江苏省苏州市。通过全球战略和多元化的市场布局…

20241123-四元数高阶奇异值分解-(1)

四元数高阶奇异值分解及其在彩色图像处理中的应用-(1) &#x1f4d4; 声明 &#x1f1e8;&#x1f1f3; : 1️⃣ &#x1f4c3; 原文网址链接: 四元数高阶奇异值分解及其在彩色图像处理中的应用 - ScienceDirect &#x1f517; Quaternion … image processing (arxiv.org) ​ …

游戏引擎学习第20天

视频参考:https://www.bilibili.com/video/BV1VkBCYmExt 解释 off-by-one 错误 从演讲者的视角&#xff1a;对代码问题的剖析与修复过程 问题的起因 演讲者提到&#xff0c;他可能无意中在代码中造成了一个错误&#xff0c;这与“调试时间标记索引”有关。他发现了一个逻辑问题…

python开发之Linux

文章目录 1. 基础2. 进阶链接压缩/解压缩 文件权限用户远程操作编辑文件软件安装 1. 基础 # 查看当前目录下文件 ls# 查看当前目录 pwd# 清除界面内容 clear# 切换目录 cd# 创建目录 mkdir# 创建文件 touch 文件 vi 文件# 强制删除 rm -rf # 复制文件 cp 复制文件 复制文件路径…