赞
踩
Kotlin号称全面兼容Java,所以Java中的容器ArrayList、HashMap在Kotlin中也是可以使用的,当然Kotlin也实现了自己的容器。通常容器有三类集合Set、队列List、映射Map,每类容器又分为只读和可变两种类型。Kotlin中对变量的修改操作很慎重,变量在定义的时候就指定了能否修改,比如用var修饰的变量可以修改,使用val修饰的变量不能修改。容器默认是只读的,如果允许修改,需要加上Mutable前缀,比如MutableSet表示可变集合,MutableList表示可变列表,MutableMap表示可变映射,只有可变容器才能对其内部元素进行增、删、改操作。
容器的公共操作方法:
Kotlin可以允许在声明容器变量时进行初始化赋值,如同对数组变量进行初始化那样,而Java则不行,下面是一个初始化List列表的例子:
val weeks:List<String> = listOf("星期一","星期二","星期三","星期四","星期五","星期六","星期日")
下面列出不同容器初始化方法
容器 | 容器名称 | 容器初始化方法 |
---|---|---|
只读集合 | Set | setOf |
可变集合 | MutableSet | mutableSetOf |
只读队列 | List | listOf |
可变队列 | MutableList | mutableListOf |
只读映射 | Map | mapOf |
可变映射 | MutableMap | mutableMapOf |
集合是一种最简单的容器,特征如下:
(1)内部元素不按顺序排列,无法通过下标访问
(2)内部元素存在唯一性,通过hash值校验是否相同元素,相同则覆盖
对于MutableSet还有下列限制:
(1)MutableSet的add方法仅仅往集合中添加元素,由于集合无序,因此不知道添加的位置
(2)MutableSet没有修改元素的方法,一旦元素添加,不可以修改
(3)MutableSet的remove方法用于删除元素,但无法删除指定位置元素,因为集合无序
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"
}
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"
}
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)不能通过下标获取指定位置元素
鉴于集合的上述缺点,通常开发中用的比较少,大多数场合还是队列和映射用的比较多。
队列是一种元素按照顺序排列的容器,其与集合最大区别是多了次序管理。队列特征如下:
(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 }
映射内部保存的是一组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"))
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"
}
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"
}
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可以
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。