Kotlin学习指南——容器详解

1. 简介

Kotlin号称全面兼容Java,所以Java中的容器ArrayList、HashMap在Kotlin中也是可以使用的,当然Kotlin也实现了自己的容器。通常容器有三类集合Set、队列List、映射Map,每类容器又分为只读和可变两种类型。Kotlin中对变量的修改操作很慎重,变量在定义的时候就指定了能否修改,比如用var修饰的变量可以修改,使用val修饰的变量不能修改。容器默认是只读的,如果允许修改,需要加上Mutable前缀,比如MutableSet表示可变集合,MutableList表示可变列表,MutableMap表示可变映射,只有可变容器才能对其内部元素进行增、删、改操作。

容器的公共操作方法:

  • isEmpty 判断该容器是否为空
  • isNotEmpty 判断该容器是否非空
  • clear 清空该容器
  • contains 判断该容器是否包含指定元素
  • iterator 获取该容器的迭代器
  • count 获取该容器包含的元素个数,也可以通过size属性获取元素数量

Kotlin可以允许在声明容器变量时进行初始化赋值,如同对数组变量进行初始化那样,而Java则不行,下面是一个初始化List列表的例子:

val weeks:List<String> = listOf("星期一""星期二""星期三""星期四""星期五""星期六""星期日")

下面列出不同容器初始化方法

容器容器名称容器初始化方法
只读集合SetsetOf
可变集合MutableSetmutableSetOf
只读队列ListlistOf
可变队列MutableListmutableListOf
只读映射MapmapOf
可变映射MutableMapmutableMapOf

2. 集合Set/MutableSet

集合是一种最简单的容器,特征如下:
(1)内部元素不按顺序排列,无法通过下标访问
(2)内部元素存在唯一性,通过hash值校验是否相同元素,相同则覆盖
对于MutableSet还有下列限制:
(1)MutableSet的add方法仅仅往集合中添加元素,由于集合无序,因此不知道添加的位置
(2)MutableSet没有修改元素的方法,一旦元素添加,不可以修改
(3)MutableSet的remove方法用于删除元素,但无法删除指定位置元素,因为集合无序

2.1 集合遍历方法

Kotlin集合遍历方法有for-in循环、迭代器遍历及forEach三种方法

1.for-in循环

val contactsMutSet:Set<String> = setOf("zhangsan", "lisi", "wangwu", "xiaoming", "xiaohong", "xiaohua")
btn_set_for.setOnClickListener {
 var desc = ""
 //使用for-in循环取出集合中的每条记录
 for (item in contactsMutSet) {
 desc = "${desc}名字:${item}\n"
 }
 tv_set_result.text = "通讯录中包含${contactsMutSet.size}个联系人。\n$desc"
}
  1. 迭代遍历
btn_set_iterator.setOnClickListener {
 var desc = ""
 val iterator = contactsMutSet.iterator()
 //如果迭代器还存在下一个节点,就继续取出下一个节点记录
 while (iterator.hasNext()) {
 val item = iterator.next()
 desc = "${desc}名字:${item}\n"
 }
 tv_set_result.text = "通讯录中包含${contactsMutSet.size}个联系人。\n$desc"
}
  1. forEach遍历
btn_set_foreach.setOnClickListener {
 var desc = ""
 //forEachٖ内部使用it指代每条记录
 contactsMutSet.forEach { desc = "${desc}名字:${it}\n" }
 tv_set_result.text = "通讯录中包含${contactsMutSet.size}个联系人。\n$desc"
}

总结下集合的缺点:
(1)不允许修改内部元素的值
(2)无法删除指定位置元素
(3)不能通过下标获取指定位置元素
鉴于集合的上述缺点,通常开发中用的比较少,大多数场合还是队列和映射用的比较多。

3. 队列List/MutableList

队列是一种元素按照顺序排列的容器,其与集合最大区别是多了次序管理。队列特征如下:
(1)队列能通过get方法获取指定位置的元素,也可以通过下标获取指定位置元素。
(2)MutableList的add方法每次都是把元素添加到队列末尾,也可以指定添加位置。
(3)MutableList的set方法允许替换或者修改制定位置元素
(4)MutableList的removeAt方法允许删除指定位置的元素
(5)队列除了集合通用的三种遍历方式(for-in, Iterator, forEach),还有按元素下标遍历的方式

val contactsMutList:List<String> = listOf("zhangsan", "lisi", "wangwu", "xiaoming", "xiaohong", "xiaohua")
btn_for_index.setOnClickListener {
 var desc = ""
 //indices是队列的下标数组,如果队列大小为10,下标数组的取值为0-9
 for (i in contactsMutList.indices) {
 val item = contactsMutList[i]
 desc = "${desc}名字:${item}\n"
 }
 tv_list_result.text = "通讯录中联系人包括${contactsMutList.size}个联系人。\n$desc"
}

(6)MutableList提供了sort系列方法用于给队列的元素重新排序,其中sortBy方法表示按照指定条件排序,sortByDescending方法表示按照指定条件降序排列。

var sortAsc = true
btn_sort_by.setOnClickListener {
 if (sortAsc) {
 //sortBy表示升序排列,最后跟的是排序条件
 contactsMutList.sortBy { it.length }
 } else {
 //sortByDescending表示降序排列,后面跟排序条件
 contactsMutList.sortByDescending { it.length }
 }
 var desc = ""
 for (item in contactsMutList) {
 desc = "${desc}名字:${item}\n"
 }
 tv_list_result.text = "通讯录中联系人已按${if (sortAsc) "升序" else "降序号"}重新排列\n$desc"
 sortAsc = !sortAsc
}

4. 映射Map/MutableMap

映射内部保存的是一组Key-Value。元素的键和值是一一对应的关系,个元素键名是唯一的,映射有如下特征:
(1)映射的containsKey方法判断是否存在指定键名的元素,containsValues方法判定是否存在指定键值的元素。
(2)MutableMap的put方法不单单添加元素,还能智能数据存储。每次调用put方法添加时,映射会先根据键名寻找相同元素,找不到则添加新元素,找到就用新元素替换旧元素。
(3)MutableMap的remove方法通过键名删除元素。
(4)调用mapOf和mutableMapOf方法初始化映射时,有两种方式可以表达单个键值对元素,其一是采用“键名to键值”的形式,其二是采用Pair配对方式,形如“Pair(键名,键值)”。下面是两种初始化的代码例子:

//to方式初始化映射
var goodsMap: Map<String, String> = mapOf("苹果" to "iPhone8", "华为" to "Mate10", "小米" to "xiaomi6", "Oppo" to "OPPO R11", "Vivo" to "vivo X9S", "魅族" to "魅族Pro6S")
//Pair方式初始化映射
var goodsMutMap: MutableMap<String, String> = mutableMapOf(Pair(" 苹果", "iPhone8"), Pair("华为", "Mate10"), Pair("小米", "小米6"), Pair("Oppo", "OPPO R11"), Pair("Vivo", "vivo X9S"), Pair("魅族", "魅族Pro6S"))

  1. for-in方式遍历
    for-in语句取出来的是映射的元素键值对,若要获取该元素的键名,还需访问元素的key属性;若要获取该元素的键值,还需要访问该元素的value属性。
btn_map_for.setOnClickListener {
 var desc = ""
 //ֵ使用for-in方式取出映射中每条记录
 for (item in goodsMutMap) {
 //item.key表示该配对的键,表示厂家; item.value表示该配对的值,即手机名称
 desc = "${desc}厂家:${item.key}, 名称:${item.value}\n"
 }
 tv_map_result.text = "手机畅销榜包含以下${goodsMutMap.size}型号手机:\n$desc"
}
  1. 迭代器方式遍历
btn_map_iterator.setOnClickListener {
 var desc = ""
 val iterator = goodsMutMap.iterator()
 //如果迭代器存在下一个节点,就继续取出下一个节点的记录
 while (iterator.hasNext()) {
 val item = iterator.next()
 desc = "${desc}厂家:${item.key},名称:${item.value}\n"
 }
 tv_map_result.text = "手机畅销榜包含以下${goodsMutMap.size}型号手机:\n$desc"
}
  1. for-Each方式遍历
btn_map_foreach.setOnClickListener {
 var desc = ""
 //映射的forEach函数需要API 24以上版本支持
 //forEachٖ内部使用key指定每条记录的键值,使用value指代每条记录的值
 goodsMap.forEach { key, value -> desc = "${desc}厂家:${key},名称:${value}\n" }
 tv_map_result.text = "手机畅销榜包含以下${goodsMutMap.size}型号手机:\n$desc"
}

Kotlin可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvin880828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值