kotlin数据容器

 

dd3f5d43598c2a98a8352180c00a09de.png

人不走空

 

                                                                      

      🌈个人主页:人不走空      

💖系列专栏:算法专题

⏰诗词歌赋:斯是陋室,惟吾德馨

 

da14e5cf865a427ea959fca470d8245a.gif

容器是用于存放数据的载体。容器分为数组、集合。

Kotlin作为一门全新的语言,肯定还是要有自己的容器类,不然哪天Java跟Kotlin划清界限,那麻烦就大了。

Kotlin也拥有三类基本的容器,分别是集合Set、队列List、映射Map,每种容器又分作只读与可变两种类型这是为了判断该容器能否进行增删改等变更操作。

  • Kotlin数组

  • Kotlin集合

Kotlin数组

数组是一种初始化时指定容器大小,不可以动态调整其大小的容器。元素按顺序存储在一串连续的内存段上。

Kotlin数组创建技巧

arrayOf创建数组

创建一个数组并传递元素值给它, 集合中的元素可以是任意类型

val array = arrayOf(1, 2, 3)                     
val array = arrayOf(1, true, "2", JSONObject())  // 集合中的元素可以是任意类型

arrayOfNulls创建数组

创建一个指定大小的、所有元素都为空的数组,但必须指定集合中的元素类型

 val arrayOfNulls = arrayOfNulls<String>(5)  //创建一个指定大小的、所有元素都为空的数组

动态创建数组

用接受数组大小以及一个方法参数的 Array 构造方法,用作参数的方法能够返回给定索引的每个元素初始值:

// 创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }

原生类型数组

在Kotlin中也有无装箱开销的专门的类来表示原生类型数组:

原生类型数组解释
ByteArray字节型数组
ShortArray短整型数组
IntArray整型数组
LongArray长整型数组
BooleanArray布尔型数组
CharArray字符型数组
FloatArray浮点型数组
DoubleArray双精度浮点型数组

IntArray函数

// 1.创建并初始化一个IntArray  [1, 2, 3, 4, 5]
val intArray = IntArray(1, 2, 3, 4, 5)// 2.创建一个长度为5的空的IntArray
val intArray2 = IntArray(5)// 3.创建一个长度为5的值全为100的IntArray [100, 100, 100, 100, 100]
val intArr2 = IntArray(5) { 100 } // 4.注意这里it是它索引下标值,所以这是创建一个长度为5的IntArray [0, 2, 4, 6, 8]
val intArr3 = IntArray(5) { it * 2 }

 

 Tips

 

Kotlin数组类型不是集合中的一种,但是它又和集合有着太多相似的地方。

数组和集合可以互换

初始化集合的时候可以传入一个数组

数组常见的操作

 

436b6cdb651749c6a75e5d7c12cbf2dc.png

 

获取元素

val array =arrayOf(1,2,3,4,5)array[index] // 获取数组的第index个元素,下标从0开始
array.component1() … arr.component5()获取数组的前5个元素。同样适用于集合。

for循环——元素遍历

for (item in array) { // 元素遍历println(item)//1//2//3//4//5
}

for循环——下标遍历

for (i in array.indices) {  // 根据下标再取出对应位置的元素println(i.toString() + "->" + array[i])=//0->1//1->2,//2->3,//3->4,//4->5
}

for循环——遍历元素(带索引)

for ((index, item) in array.withIndex()) {  // 同时遍历下标 和 元素println("$index->$item")//0->1//1->2//2->3//3->4//4->5
}

forEach遍历数组

array.forEach {println(it)//1//2//3//4//5
}

forEach增强版

array.forEachIndexed { index, item ->println("$index:$item")//0:1//1:2//2:3//3:4//4:5
}

数组翻转

array.reverse() 
>> println(array) = 5,4,3,2,1

Kotlin集合

Kotlin 标准库提供了一整套用于管理集合的工具,集合是可变数量(可能为零)的一组条目,各种集合对于解决问题都具有重要意义,并且经常用到。与数组不同的是可变集合的大小可以动态改变。

  • List: 是一个有序集合,可通过索引(反映元素位置的整数)访问元素。元素可以在 list 中出现多次。列表的一个示例是一句话:有一组字、这些字的顺序很重要并且字可以重复。

  • Set: 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。一般来说 set 中元素的顺序并不重要。例如,字母表是字母的集合(set)。

  • Map: (或者字典)是一组键值对。键是唯一的,每个键都刚好映射到一个值,值可以重复。

集合创建的技巧

集合分为可变集合,显而易见,是指集合创建完成之后,可以对集合进行增删改查操作

不可变集合,显而易见,是指指集合创建完成之后,不能对集合进行增删改查操作,会抛异常

数组创建方式示例说明是否可变
arrayListOf<T>()
mutableListOf<T>
相同元素类型的队列
val array = arrayListOf<Int>(1, 2, 3)
val array = mutableListOf<String>()
- 必须指定元素类型可变
listOf<T>()
相同元素类型的集合
val array = listOf<Int>(1, 2, 3)- 必须指定元素类型
- 必须指定初始化数据元素
不可变
arrayMapOf<K,V>()
mutableMapOf<K,V>
相同元素类型的字典
val array= arrayMapOf(Pair("key","value"))
val array= mutableMapOf()
- 初始元素使用Pair包装可变
mapOf<T>()
相同元素类型的字典
val array= mapOf(Pair("key","value"))- 元素使用Pair包装
- 必须指定初始元素
不可变
arraySetOf<T>()
mutableSetOf<T>
相同元素类型的集合
val array= arraySetOf<TInt>(1,2,3)
val array= mutableSetOf<Int>()
- 会对元素自动去重可变
setOf<T>()
相同元素类型的集合
val array= arraySetOf<Int>(1,2,3)- 对元素自动去重
- 必须指定元素类型。
不可变

List队列

队列是一种元素之间按照顺序排列的容器,它与集合的最大区别,便是多了个次序管理。不要小看这个有序性,正因为队列建立了秩序规则,所以它比集合多提供了如下功能(注意凡是涉及到增删改的,都必须由MutableList来完成):

  • 不可变集合

val strings = listOf("one", "two", "one") // 不可以对strings进行增删改查操作
  • 可变集合

val numbers = mutableListOf<Int>(1, 2, 3, 4) // 可以对numbers进行增删改查操作
val numbers = arrayListOf<Int>(1, 2, 3)

 

 Tips

 

不难发现,每个不可变集合都有对应的可变集合,也就是以mutable为前缀的集合。

  • 不可变的List类型集合的初始化使用:listOf函数
  • 可变的List类型集合的初始化使用:mutableListOf函数

Set集合

1、容器内部的元素不按顺序排列,因此无法按照下标进行访问;

2、容器内部的元素存在唯一性,通过哈希值校验是否存在相同的元素,如果存在则覆盖之;

  • 不可变集合

val hello = setOf("H", "e", "l", "l", "o")//自动过滤重复元素>> println(hello) = H", "e", "l","w", "o"
  • 可变集合

val hello = mutableSetOf("H", "e", "l", "l", "o") //自动过滤掉重复元素>> println(hello) = H", "e", "l","w", "o", "r", "l", "d"

 

 Tips

 

  • 不可变的set类型集合的初始化使用:setOf函数
  • 可变的set类型集合的初始化使用:mutableSetOf函数

Map字典

映射内部保存的是一组键值对(Key-Value),也就是说,每个元素都由两部分构成,第一部分是元素的键,相当于元素的名字;第二部分是元素的值,存放着元素的详细信息。元素的键与值是一一对应的关系,相同的键名指向的值对象是唯一的,所以映射中每个元素的键名各不相同,这个特性使得映射的变更操作与队列存在以下不同之处(注意增删操作必须由MutableMap来完成):

  • 不可变集合

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)>> println("${numbersMap.keys}")= key1,key2,key3,key4           
>> println("${numbersMap.values}") = 1,2,3,1
  • 可变集合

val numbersMap = mutableMapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)>> println("${numbersMap.keys}")= key1,key2,key3,key4           
>> println("${numbersMap.values}") = 1,2,3,1

 

 Tips

 

  • 不可变的map类型集合的初始化使用:mapOf函数
  • 可变的map类型集合的初始化使用:mutableMapOf函数

集合的操作

 

c379635abef64cd1926c8bdae978fc66.png

 

增删改查

val stringList = listOf("one", "two", "one")  以list集合为例,set,map同样具备以下能力numbers.add(5)          // 集合最后面添加元素5
numbers.addAt(1,5)      // 向下标为1的位置,添加元素5,下标为1及之后位置的元素,以此后移numbers.remove("one")   // 删除元素“one”
numbers.removeAt(1)     // 删除下标为1的元素numbers.set(0) = 0      // 下标为0的元素设置为0numbers.get(0)==>1      // 获取下标为0的元素,结果为1

变换操作

在Kotlin中提供了强大对的集合排序的API,让我们一起来学习一下:

val numbers = mutableListOf(1, 2, 3, 4)
numbers.reverse()         //列表翻转
>> println(numbers)= 4, 3, 2, 1numbers.shuffle()        //随机排列元素
>> println(numbers)= 1, 3, 4, 2numbers.sort()           //排序,从小打到
>> println(numbers)= 1, 2, 3, 4numbers.sortDescending() //从大到小
>> println(numbers)= 4, 3, 2, 1//定义一个Person类,有name 和 age 两属性
class Language{var name: String='name',var score: Int=100
}val languageList: MutableList<Language> = mutableListOf()
languageList.add(Language("Java", 80))
languageList.add(Language("Kotlin", 90))
languageList.add(Language("Dart", 99))
languageList.add(Language("C", 80))//使用sortBy进行排序,适合单条件排序
languageList.sortBy { it.score }  //it变量是lambda中的隐式参数
>> println(languageList)= [{Java", 80},{"C", 80},{"Kotlin", 90},{"Dart", 99}]//使用sortWith进行排序,适合多条件排序
languageList.sortWith(compareBy({ it.score }, { it.name })) 
>> println(languageList)= [{"C", 80},{Java", 80},{"Kotlin", 90},{"Dart", 99}]

 

 


作者其他作品:

【Java】Spring循环依赖:原因与解决方法

OpenAI Sora来了,视频生成领域的GPT-4时代来了

[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读

【Java】深入理解Java中的static关键字

[Java·算法·简单] LeetCode 28. 找出字a符串中第一个匹配项的下标 详细解读

了解 Java 中的 AtomicInteger 类

算法题 — 整数转二进制,查找其中1的数量

深入理解MySQL事务特性:保证数据完整性与一致性

Java企业应用软件系统架构演变史

 

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

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

相关文章

网优学习干货:xx5G速率优化现场实战版

速率概述 无线网络仍然是5G网络能力最容易受限的环节&#xff0c;无线网络技术的应用将最终决定5G网络能力的木桶深度。移动通信中传统关键技术在5G将会继续使用。5G NR在继承了LTE原有部分技术基础上&#xff0c;采用了一些技术演进和新技术创新。比如NR继承了LTE的OFDM和SC-…

ArduPilot开源飞控之AP_Mount_Topotek

ArduPilot开源飞控之AP_Mount_Topotek 1. 源由2. 框架设计3. 重要函数3.1 动态过程3.1.1 AP_Mount_Topotek::update3.1.2 AP_Mount_Backend::calculate_poi 3.2 基础能力3.2.1 AP_Mount_Topotek::healthy3.2.2 AP_Mount_Topotek::has_pan_control 3.3 设备功能3.3.1 AP_Mount_T…

python 实验八 数据分析与展示

一、实验目的 掌握掌握matplotlib库中pyplot模块的使用。 二、实验环境 Window10&#xff08;x64&#xff09;&#xff0c;Python 3.8&#xff08;x64&#xff09;&#xff0c;PyCharm Community Edition 2020.3.2&#xff08;x64&#xff09; 三、实验内容 现有列表hight…

初学SpringMVC之过滤器解决乱码

写个 login.jsp 页面 提交的 method 一般为 post&#xff08;写 get 不安全&#xff0c;地址栏上会显示&#xff09; action 表示提交后跳转的地址 &#xff08;不直接写控制器里的路径是因为配置 Tomcat 时设置了前缀路径&#xff0c;默认走 http://localhost:8080&#xf…

市面上的护眼台灯哪个牌子最好?分享学生护眼台灯十大排名

家长们对孩子的用眼健康很重视&#xff0c;为什么&#xff1f;现在是科技电子时代&#xff0c;人们对电子屏幕的依赖性高&#xff0c;小孩子年纪小&#xff0c;眼部还处于正在发育的阶段&#xff0c;他们在学校中长时间的学习读写&#xff0c;用眼时间长。而且随着科技渗入教学…

如何选择小型超声波清洗机? 2024年值得买的四款眼镜清洗机总结

久了不擦洗的眼镜&#xff0c;往往会滋生很多细菌病毒&#xff0c;久而久之就会影响到视力和眼睛健康。而超声波清洗机作为一款高效清洁物品&#xff0c;可以帮助人们快速且深度地清洁眼镜&#xff0c;很多清洗机使用久一点清洁力就减弱了&#xff0c;所以要找一款性价比高的清…

【Java EE】统一功能返回

一、拦截器 1.1 拦截器的作用 在对于数据库进行增删查改的时候&#xff0c;如果当前页面不检查用户是否登录&#xff0c;然后就能操作成功是不合理的&#xff0c;解决方法有两个&#xff1a; 对于已经写好的每个接口都加上一个判断&#xff0c;从Session中获取用户信息&…

CSS 中的 ::before 和 ::after 伪元素

目录 一、CSS 伪元素 二、::before ::after 介绍 1、::before 2、::after 3、content 常用属性值 三、::before ::after 应用场景 1、设置统一字符 2、通过背景添加图片 3、添加装饰线 4、右侧展开箭头 5、对话框小三角 6、插入icon图标 一、CSS 伪元素 CSS伪元…

Spring Boot:连接MySQL错误Public Key Retrieval is not allowed

环境&#xff1a; MySQL版本&#xff1a;8.0.17 SpringBoot版本&#xff1a;2.5.15 解决 解决方式很简单&#xff0c;在数据库配置连接字符串spring.datasource.url末尾添加&allowPublicKeyRetrievaltrue即可&#xff0c;如下图&#xff1a; 重新启动&#xff0c;恢复正常…

django招聘数据分析与可视化管理系统-计算机毕业设计源码55218

摘要 随着互联网的迅速发展&#xff0c;招聘数据在规模和复杂性上呈现爆炸式增长&#xff0c;对数据的深入分析和有效可视化成为招聘决策和招聘管理的重要手段。本论文旨在构建一个基于Python的招聘数据分析与可视化管理系统。 该平台以主流招聘平台为数据源&#xff0c;利用Py…

四元数和旋转矩阵的求导

四元数的导数 四元数关于时间求导的推导 本质&#xff1a; 求导的定义是函数值的微增量关于自变量的微增量的极限。表示旋转的单位四元数作差后&#xff0c;其不再是单位四元数&#xff0c;也就不是旋转四元数了。单位四元数作差后&#xff0c;得到是被减四元数所在空间的切空…

直观易用的大模型开发框架LangChain,你会了没?

目录 简介基本组件小试牛刀关于沟通代码案例&#xff1a;调用Embedding、Completion、Chat Model总结 目前LangChain框架在集团大模型接入手册中的学习案例有限&#xff0c;为了让大家可以快速系统地了解LangChain大模型框架并开发&#xff0c;产出此文章。本文章包含了LangCha…

视频监控汇聚平台LntonCVS视频集中存储平台解决负载均衡的方案

随着技术的进步和企业对监控需求的增加&#xff0c;视频监控系统规模不断扩大&#xff0c;接入大量设备已成常态化挑战。为应对这一挑战&#xff0c;视频汇聚系统LntonCVS视频融合平台凭借其卓越的高并发处理能力&#xff0c;为企业视频监控管理系统提供可靠的负载均衡服务保障…

优化 Java 数据结构选择与使用,提升程序性能与可维护性

优化 Java 数据结构选择与使用&#xff0c;提升程序性能与可维护性 引言 在软件开发中&#xff0c;数据结构的选择是影响程序性能、内存使用以及代码可维护性的关键因素之一。Java 作为一门广泛使用的编程语言&#xff0c;提供了丰富的内置数据结构&#xff0c;如数组、链表、…

JavaSE 面向对象程序设计进阶 IO 综合练习 利用糊涂包生成假数据 随机点名器 登录案例

目录 生成假数据 利用糊涂包生成假数据 随机点名器 综合练习 生成假数据 制造假数据 制造假数据也是开发中的一个能力 在各个网上爬取数据 这是其中一个方法 爬取网站中的内容 import cn.hutool.core.io.FileUtil;import java.io.IOException; import java.io.InputSt…

昇思25天学习打卡营第24天 | LSTM+CRF序列标注

内容介绍&#xff1a; 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名实…

【JavaScript 算法】二分查找:快速定位目标元素

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;适用于在有序数组中快速定位目标元素。相比于线性查找&#xff0c;二分查找…

护(H)网(W)行动正当时:你对HW知多少,一文带你全面了解护网行动

引言&#xff1a;2016年我国发布了《网络安全法》&#xff08;于2017年6月1日正式生效&#xff09;&#xff0c;明确规定了关键信息基础设施的运营者必须制定网络安全事件应急预案&#xff0c;并定期进行演练&#xff0c;为HW行动的开展提供了法律依据&#xff0c;通过红蓝对抗…

Unity 中使用状态机模式来管理UI

1. 清晰的状态管理 状态机模式允许你以结构化的方式管理不同的UI状态。每个状态&#xff08;比如主菜单、设置菜单、游戏中界面等&#xff09;都有其独立的行为和属性&#xff0c;这使得管理复杂UI逻辑变得更加清晰和可维护。 2. 简化的状态切换 状态机模式可以简化不同UI状…

报表控件DevExpress Reporting中文教程 - 如何创建穿透钻取报表?

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 钻取报表允许用户通过单击主/活动报表文档中的…