【教程】Kotlin语言学习笔记(三)——数据容器(持续更新)

文首标志
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【Kotlin语言学习】系列文章

第一章 《认识Kotlin》
第二章 《数据类型》
第三章 《数据容器》


文章目录

  • 【Kotlin语言学习】系列文章
  • 一、数组
    • (一)数组定义
    • (二)原生类型数组
    • (三)数组元素遍历
      • 1.for循环遍历
      • 2.forEach遍历
  • 二、集合
    • (一)集合分类
      • 1.不可变集合
      • 2.可变集合
    • (二)集合定义
      • 1.列表
      • 2.集合
      • 3.映射
    • (三)集合操作


在 Kotlin 中,有多种数据容器可用于存储和组织数据。容器分为数组、集合。

一、数组

数组(Array),是指用于存储具有相同类型的固定长度元素序列的数据容器。Kotlin 的数组是不可变的,长度固定,不能添加或删除元素。

(一)数组定义

创建数组的方式有很多种。

首先就是通过arrayOf来创建数组,其能够创建一个数组并传递元素给它,而其中的元素可以是任意类型。以下代码的JSON对象JSONObject类型需要导入新的类,这里仅做示例。

val arr1 = arrayOf(1, 2, 3)
val arr2 = arrayOf(1, true, "2", JSONObject())// 内部的元素可以是任何类型

如果想要指定类型,则需要再声明制定的数据类型。

val arrInt: Array<Int> = arrayOf(1, 2, 3)// 指定类型为Int

同时,还可以使用arrayOfNulls创建一个指定大小的,所有元素都为空的数组。但必须指定集合中的数据类型。构造完成,则可以使用索引操作符[]访问每个元素,然后逐个给元素赋值。

val arrayOfNulls = arrOfNulls<String>(5)// 创建一个元素类型为字符串的5个元素的空数组
arrayOfNulls[0] = "element1"
arrayOfNulls[1] = "element2"
arrayOfNulls[2] = "element3"
arrayOfNulls[3] = "element4"
arrayOfNulls[4] = "element5"

除此之外,还可以用Array构造函数来创建数组,虽然比较少用,但还是予以介绍,其基本语法如下。

val numbers = Array(5) { index -> index * 2 }  // 创建一个包含 5 个元素的数组,每个元素的值是索引值的两倍

这里的参数5是数组的长度,{ index -> index * 2 } 是一个 lambda 表达式(下一章详细讲解),用于初始化数组的元素。在 lambda 表达式中,index 表示当前元素的索引。

(二)原生类型数组

原生类型数组(Primitive Type Arrays) 来使用指定的原生数据类型来表示数组的元素,而不是使用对应的包装类型。这种表示方式避免了自动装箱和拆箱的开销,可以直接在数组中存储原生数据类型的值。

原生类型数组函数描述
ByteArray()字节型数组
ShortArray()短整型数组
IntArray()整型数组
LongArray()长整型数组
FloatArray()浮点型数组
DoubleArray()双精度浮点型数组
CharArray()字符型数组
BooleanArray()布尔型数组

原生类型数组的创建和普通数组的定义基本相同。

val numbers = IntArray(5)  // 创建一个包含5个整数元素的数组,初始值默认为0
val flags = BooleanArray(3)  // 创建一个包含3个布尔元素的数组,初始值默认为0即false
val bytes = ByteArray(10)  // 创建一个包含10个字节元素的数组,初始值默认为0

(三)数组元素遍历

遍历(iterate) 是指逐个访问数据结构中的元素或项的过程。在编程中,我们经常需要遍历数组、列表、集合或其他类型的数据结构来处理其中的元素。

遍历可以用于执行各种操作,例如打印元素、计算总和、查找特定元素、过滤元素等。这里可以使用for循环进行遍历。

1.for循环遍历

for (item in intArr) { // 元素遍历println(item)
}

其中item代表变量intArr中的每个元素。
同时,还可以通过indices属性来获得创建的数组的索引。

for (i in intArr.indices) {println(i.toString() + "->" + intArr[i])
}

对于上面的代码,是通过在for循环的in关键字访问每一个索引,从而达到的遍历效果。返回结果如下。

0->1
1->2
2->3

也可以使用带索引的方法来遍历。

for ((index, item) in intArr.withIndex()) {println("$index->$item")}

这种方式使用了withIndex()函数获取了一个包含数组元素和索引的序列。然后再通过解构声明将元素和索引序列填入(index, item)这两个变量中,随后输出。输出结果同上一个示例。

2.forEach遍历

forEach()是 Kotlin 标准库中可用于遍历集合的函数。它接受一个 lambda 表达式作为参数,并使用 lambda 表达式对集合中的每个元素执行操作。这里就可以用forEach()来遍历数组中的元素。

intArr.forEach{println(it)// 这里的it代表数组的元素,同样也是lambda表达式
}

二、集合

在 Kotlin 中,集合(Collections) 是一种常用的数据结构,用于存储多个元素。Kotlin 标准库提供了多种集合类型,每种类型在不同的使用场景下有不同的特点和优势。

(一)集合分类

集合分为不可变集合和可变集合。

1.不可变集合

不可变集合(Immutable Collections) 是指创建后不可进行添加、删除或修改等操作的集合。不可变集合是线程安全的,可以在多个线程中共享使用,因为不会发生并发修改的情况。

Kotlin 的标准库提供了以下不可变集合类型:

  • 列表(List):是一个有序的集合,可以包含重复的元素,可通过索引(下标)访问元素。
  • 集合(Set):是一个无序的集合,不能包含重复的元素,要求元素必须唯一。
  • 映射(Map):是一种键值对的集合,每个元素由键和值组成。键是唯一的,值可以重复,类似其他语言中的字典数据类型。

要注意的是,不可变集合虽然无法直接进行元素的增删改操作,但可以通过操作符和函数进行集合操作,例如过滤、映射、排序等。

2.可变集合

可变集合(Mutable Collections) 是指在创建后可以进行添加、删除或修改等操作的集合。可变集合不是线程安全的,需要注意在多线程环境下使用时进行适当的同步。

Kotlin 的标准库提供了对应的可变集合类型:

  • 可变列表(MutableList):可变的有序集合。
  • 可变集合(MutableSet):可变的无序集合。
  • 可变映射(MutableMap):可变的键值对集合。

通过可变集合的函数和操作符,可以对集合进行增删改操作,例如使用add()添加元素,使用remove()删除元素,使用索引进行修改等。

(二)集合定义

1.列表

对于不可变列表的创建,需要使用listOf函数进行创建。其创建语法如下。

val list1: List<Int> = listOf(1, 2, 3, 4, 5)

不可变列表的元素是只读的,一旦创建,就不能通过索引来进行修改,也无法直接添加新元素。不可变列表的长度不可变,元素在创建后也不能更改。

而对于可变列表,则需要使用mutableListOf()函数进行创建,其语法如下。

val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)

不同于不可变列表,可变列表的长度和元素都可以在运行时进行更改。

val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2[0] = 10
println(list2) // 输出: [10, 2, 3, 4, 5]

或者使用add()remove()等方法更改元素。

add()用于在列表末尾添加一个元素。这个方法会修改原始列表。

val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2.add(6)
println(list2) // 输出: [1, 2, 3, 4, 5, 6]

remove()用于删除列表中的指定元素。

val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2.remove(3)
println(mutableNumberList) // 输出: [1, 2, 4, 5]

2.集合

对于不可变列表的创建,需要使用setOf函数进行创建。其创建语法如下。

val set1: Set<String> = setOf("apple", "banana", "orange")

而对于可变列表,则需要使用mutableSetOf()函数进行创建,其语法如下。

val set2: MutableSet<String> = mutableSetOf("apple", "banana", "orange")

add()用于在集合末尾添加一个元素。

val list2: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list2.add(6)
println(list2) // 输出: [1, 2, 3, 4, 5, 6]

但需要注意的是如果想要添加的元素已经在集合中出现,就无法再添加进去。

3.映射

对于不可变映射的创建,需要使用mapOf函数进行创建。其创建语法如下。

val map1: Map<String, Int> = mapOf("apple" to 1, "banana" to 2, "orange" to 3)

可以看到,对于映射,需要同时定义键和值的数据类型,这里定义键的数据类型为字符串String,值的数据类型为整型Int;赋值也需要同时赋值键和值,首先赋值键,然后用to关键字连接键值对,最后赋值值。这里“apple”、“banana” 和 “orange” 是键,它们分别映射到对应的值为1、2和3。

定义映射还可以用pair()函数还创建一对数据,使得定义映射时不需要再使用to关键字。

val map1: Map<String, Int> = mapOf(Pair("apple", 1),Pair("banana", 2),Pair("orange", 3)
)

而对于可变列表,则需要使用mutableMapOf()函数进行创建,其语法如下。

val map2: MutableMap<String, Int> = mutableMapOf("apple" to 1, "banana" to 2, "orange" to 3)
mutableMap["apple"] = 4 // 修改值
mutableMap["grape"] = 5 // 添加新的键值对

(三)集合操作

集合操作是指对集合(如列表、集、映射等)进行常见的操作。在 Kotlin 中,标准库提供了丰富的集合操作函数,可以方便地操作集合数据。

操作函数描述示例
isEmpty()判断集合是否为空set1.isEmpty()
contains(元素)判断是否包含某元素set1.contains("6")
get(索引)通过索引获取某元素set1.get(0)
indexOf(元素)获取某元素首次出现的索引set1.indexOf("banana")
lastIndexOf(元素)获取某元素最后出现的索引set1.lastIndexOf("apple")
iterator()获取集合迭代器list1.iterator()
add(元素)添加元素set1.add("grape")
remove(元素)删除元素set1.remove("grape")
addAll(集合)另一个集合添加此集合的所有元素set1.addAll(set2)
removeAll(集合)另一个集合移除此集合的所有元素set1.removeAll(set2)
retainAll(集合)另一个集合保留与此集合共有的元素set1.removeAll(set2)
cleaer()清空集合所有元素set1.clear()
set(索引, 元素 )修改指定索引的元素set1.set(0, "grape")
add(索引, 元素)指定位置添加元素list1.add(0, 6)
removeAt(索引)指定位置删除元素list1.removeAt(0)
reverse()反转集合中元素位置set1.reverse()
shuffle()随机排列元素位置set1.shuffle()
sort()从小到大排列元素位置set1.sort()

我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

略谈新质生产力与数字经济、数据、数据要素

国家发展和改革委员会宏观经济杂志社中宏经济发展研究中心以研究报告的形式刊载了高泽龙的文章&#xff0c;“新质生产力与数字经济、数据、数据要素”&#xff0c;同时&#xff0c;这篇文章在中宏网首页头部重点位置给予推荐报道。 新质生产力与数字经济、数据、数据要素https…

TiDB in 2023, 一次简单的回顾丨PingCAP 唐刘

2023 年已经过去&#xff0c;TiDB 经过了一年的迭代&#xff0c;又往前进步了一点点&#xff0c;我们非常自豪的看到&#xff0c;TiDB 正在不断地帮助我们的客户成功&#xff0c;包括但不限于&#xff1a; ○ 首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB …

第10集《佛说四十二章经》

请大家打开讲议第十一面&#xff0c;第十九章、假真并观。 前面一章念等本空&#xff0c;说明大乘佛法的修学&#xff0c;身口意应安住在非空非有的中道实相。本章对中道实相的修学&#xff0c;再做明确的说明。修中道实相观要有空观与假观的观照&#xff0c;从空观中远离有相…

【链表】-Lc146-实现LRU(双向循环链表)

写在前面 最近想复习一下数据结构与算法相关的内容&#xff0c;找一些题来做一做。如有更好思路&#xff0c;欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.双向循环链表3.代码 写在后面 一、场景描述 运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (…

LabVIEW荧光显微镜下微管运动仿真系统开发

LabVIEW荧光显微镜下微管运动仿真系统开发 在生物医学研究中&#xff0c;对微管运动的观察和分析至关重要。介绍了一个基于LabVIEW的仿真系统&#xff0c;模拟荧光显微镜下微管的运动过程。该系统提供了一个高效、可靠的工具&#xff0c;用于研究微管与运动蛋白&#xff08;如…

【北邮鲁鹏老师计算机视觉课程笔记】10 Classification 分类

【北邮鲁鹏老师计算机视觉课程笔记】10 Classification 分类 1 图像识别的基本范式 检测问题&#xff1a;不仅要知道有没有&#xff0c;还要知道在哪里 分类是整图级标签&#xff0c;检测是区域级标签&#xff0c;分割是像素级标签 2 检测任务的应用 3 单实例识别与类别识别…

Ubuntu下Anaconda+PyCharm搭建PyTorch环境

这里主要介绍在condapytorch都正确安装的前提下&#xff0c;如何通过pycharm建立开发环境&#xff1b; Ubuntu下AnacondaPyCharm搭建PyTorch环境 系统环境&#xff1a;Ubuntu22.04 conda: conda 23.11.0 pycharm:如下 condapytorch的安装教程介绍&#xff0c;请点击这里&…

【Spring】定义过滤器Filter和拦截器Interceptor

# 定义过滤器 package com.holen.filter;import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import java.io.IOException;pub…

Linux操作系统基础(十四):集群服务器搭建

文章目录 集群服务器搭建 一、新增Linux服务器 1、克隆虚拟机 2、修改虚拟机的硬件配置 3、修改虚拟机的网络配置 二、关闭防火墙 1、关闭firewalld 2、关闭SElinux 三、修改主机名 四、修改hosts映射 五、SSH免密登录 六、时钟同步 七、远程文件拷贝 1、从本机拷…

使用MICE进行缺失值的填充处理

在我们进行机器学习时&#xff0c;处理缺失数据是非常重要的&#xff0c;因为缺失数据可能会导致分析结果不准确&#xff0c;严重时甚至可能产生偏差。处理缺失数据是保证数据分析准确性和可靠性的重要步骤&#xff0c;有助于确保分析结果的可信度和可解释性。 在本文中&#…

编辑器的新选择(基本不用配置)

Cline 不用看网上那些教程Cline几乎不用配置。 点击设置直接选择Chinese, C直接在选择就行了。 Cline是一个很好的编辑器&#xff0c;有很多懒人必备的功能。 Lightly 这是一个根本不用配置的C编辑器。 旁边有目录&#xff0c;而且配色也很好&#xff0c;语言标准可以自己…

反无人机系统技术分析,无人机反制技术理论基础,无人机技术详解

近年来&#xff0c;经过大疆、parrot、3d robotics等公司不断的努力&#xff0c;具有强大功能的消费级无人机价格不断降低&#xff0c;操作简便性不断提高&#xff0c;无人机正快速地从尖端的军用设备转入大众市场&#xff0c;成为普通民众手中的玩具。 然而&#xff0c;随着消…