今天学习集合。在Kotlin中集合,分为不可变集合,以及可变集合,其中可变集合是一种可以动态改变大小的数据结构。
常用的集合有三种
- List: 有序列表,和数组类似,可以通过下标来访问元素。但是列表的大小可以动态更改
- Set: 唯一元素的集合,Set中不包含重复的对象,同时Set是无序的。
- Map:(字典)是一组键值对 (Key-Value Pair),Key是唯一的,Value可以重复。
1. 创建集合
有的集合类型是可变的,在创建后还可以对其进行增删操作,另外还有不可变的集合。
1.1 创建可变列表
- 必须指定元素类型
val arr1 = mutableListOf<Int>(1,2,3) //设置初始值
val arr2 = mutableListOf<String>() //不设置初始值
arr2.add("pen")
arr2.add("apple")
arr2.add(2, "appplepen") // 往下标2的位置添加内容
// 同样可以使用 arrayListOf<T> 来创建可变列表,但是新版本中不推荐。
1.2 创建不可变列表
- 必须指定元素类型
- 必须指定初始化数据元素
// 用listOf创建的列表不可以改变大小
val arr3 = listOf<Int>(1,2,3)
1.3 创建可变Map
可以使用一下两种方式创建可变的字典类型
arrayMapOf<K,V>
mutableMapOf<K,V>
在<>需要分辨指定Key和Value的数据类型
val map1 = mutableMapOf<String, Int>(Pair("One",1),Pair("Two",2))) //设置初始值, Key为字符串类型,Value为整数类型
val map2= mutableMapOf<String, Int>() //不设置初始值
map2.put("one", 1)
map2["two"] = 2 // 推荐的方式
map2["three"] = 3 // 推荐的方式
map2["one"] = 100 //会更新key = "one"的对应值,覆盖之前的。
// 同样可以使用 arrayMapOf<T> 来创建可变Map,但是新版本中不推荐。
1.4 创建不可变Map
val map3 = mapOf<String, Int>(Pair("One",1),Pair("Two",2)))
// map3.put("Three", 3) 此行会报错,因为map3创建后就不可以增删了
// 除了使用Pair,还可以使用to来添加键值对
val map4 = mapOf<String, String>("key1" to "one", "key2" to "two")
1.5 创建两种Set
1、容器内部的元素不按顺序排列,因此无法按照下标进行访问。
2、容器内部的元素存在唯一性,如果存在则覆盖。
创建方式与上面相同,这里就把创建可变与不可变Set的代码放一起了
// 可变的Set
val set1= mutableSetOf<String>("H", "e", "l", "l", "o") //自动过滤掉重复元素
set1.add("a")
set1.add("b")
set1.add("c")
// 不可变的Set
val set12 = setOf("H", "e", "l", "l", "o")
2. 一些常见的Kotlin列表操作
2.1 增加元素和删除元素
val list1 = mutableListOf<Int>()
list1.add(1)
list1.add(1, 2)
list1.add(3)
// list1 ----> [1,2,3]
list1.removeAt(2) // 传输下标为2的元素
list1.remove(1) // 删除元素1
// 注意!!! 调换上两行的位置会报错,因为删除元素1后,没有下标为2的元素了。
// list1 ----> [2]
list1.set(0, 10) //把下标为0的元素设为10
list1[0] = 10 //同上
list1.get(0)
list1[0] //同上
2.2 列表变换
val list2= mutableListOf(1, 2, 3, 4)
list2.reverse() //列表翻转
// list2 --> 4, 3, 2, 1
list2.shuffle() //随机排列元素
// list2 --> 1, 3, 4, 2
2.3 列表排序
val list3= mutableListOf(10, 2, 20, 8)
list3.sort() // 从小到大排序
// list3 --> 2, 8, 10, 20
list3.sortDecending() // 从大到小排序
// list3 --> 20, 10, 8, 2
// 自定义排序
// 定义一个Student类,有name 和 score两属性
fun main() {
class Student(val name:String, val score: Int) { }
val studentList: MutableList<Student> = mutableListOf()
studentList.add(Student("老大", 60))
studentList.add(Student("老二", 70))
studentList.add(Student("张三", 90))
studentList.add(Student("李四", 85))
//使用sortBy进行排序,适合单条件排序
studentList.sortBy { it.score } //按每个元素的score值进行从小到大排序
studentList.forEach() {
println("${it.name} : ${it.score}")
}
}
/*
运行结果
老大 : 60
老二 : 70
李四 : 85
张三 : 90
*/