数组和集合
1. 数组
1.1创建
为数组增加了Array类,为元素是基本类型的数组添加XXXArray类(其中XXX可以是Int、Byte、Short)。因此数组在kotlin中是对象。创建数组就相当于创建Array<T>的实例,也可以通过arrayOf()的方式创建。
因此创建数组有三种方式
- 使用arrayOf()、arrayOfNulls()、emptyArray()工具函数
- 使用Array(size:Int,init:(Int)->T)构造器
- 使用XXXArray(动态初始化)xxxArrayOf(静态初始化)
如下所示
var arr1= arrayOf("11","22","123")
var arr2= arrayOf(1,2,3,4,5)
//创建长度为20的,元素为null的String类型数组。
var arr3= arrayOfNulls<String>(20)
//创建长度为0的空数组
var arr4= emptyArray<Int>();
//使用Array(size:Int,init:(Int)->T)的构造器,10代表size=10,后面是一个lambda表达式,it作为形参
var arr5 = Array(10, { (it * 2 + 97).toChar() });
//相当于java中的静态初始化,一开始将所有元素都给出,不需要指定长度
var arr6= intArrayOf(1,2,3,4);
//相当于java中的动态初始化new,需要指定长度
var arr7=IntArray(4,{it*it})
1.2使用
使用有两种方式,第一种是get,set方法,第二种是[]。这两种其实是一种,[]实际上会调用get、set方法。
arr1.set(1,"2222");
arr1[1]="2222";
1.3 for循环
可以通过size 进行for循环的遍历
for(num in 0 until arr1.size){
println(arr1[num])
}
也可以使用更好的方式indices,这种方式比size性能更好,也更加简洁。
for(num in arr1.indices){
println(arr1[num])
}
还可以使用直接for in循环
for(element in arr1){
println(element)
}
1.4同时访问索引和元素
可以借助withIndex,会返回一个Iterable对象,如下所示,就可以同时返回索引和元素值
for((index,value) in arr1.withIndex()){
println("索引${index}上存放的元素是${value}")
}
1.5多维数组
虽然本身kotlin没有提供多维数组,但是实际上只需要让数组的元素同样是数组就可以实现
var array= arrayOfNulls<Array<Int>>(4)
array[0]= arrayOf(1,2,3,4)
array[0]!![2] = 3;
2. 集合
和java集合相同,kotlin的集合同样分为Map和Collection
2.1 可变和不可变
java中的集合都是可变集合,能够自由地往里面添加或者删除元素。而kotlin中的集合分成可变集合和不可变集合,不可变集合只能读取元素,而不能修改。如图所示是collection集合的继承树。
根据图中我们发现kotlin中的集合多了一个子接口MutableCollection,这个接口下的set和list都是可变的。注意在kotlin中并没有真正重新实现list和set,而是借用了java中的集合。
如下例所示
val list= listOf<Int>(1,2,3,34,45);
//报错,通过list创建的是不可变的集合
list.add(11);
val list2= mutableListOf<Int>(1,2,3);
//不报错,通过mutableList创建的是可变集合
list2.add(4);
2.2 Set类型
(1)set的声明和创建。
Set有三种类型,分别是HashSet、LinkedHashSet、TreeSet其中HashSet是无序的。分别用hashSetof、linkedSetOf、sortedSetOf方法进行返回。
setOf()和mutableSetOf()分别返回的不可变和可变的LinkedHashSet,这个是可变有序的,具体的特点可以查看java中的linkedHashSet。
注意:只有setOf返回的是不可变的set,剩余的方法都是返回可变的set
(2)set方法
var set = setOf("Java", "Kotlin", "Go")
//判断是否所有元素的长度都大于4
println(set.all { it.length > 4 })
//判断是否任一元素的长度大于4
println(set.any { it.length > 4 })
//以Lambda表达式的值为key,集合元素为value,组成Map集合
val map = set.associateBy { "学习" + it + "语言" }
println(map)
println("Java" in set)
println("Go" !in set)
//返回删除Set集合前面两个元素后的集合
val dropedList = set.drop(2)
println(dropedList)
//对Set集合元素进行过滤:要求集合元素包含li
val fliteredList = set.filter { "li" in it }
println(fliteredList)
//查找Set集合中包含li的元素,如果找到就返回该元素,否则就返回null
val foundStr1 = set.find { "li" in it }
println(foundStr1)
//查找Set集合中的所有字符串拼接在一起
val foldedList = set.fold("", { acc, e -> acc + e })
println(foldedList)
//查找某个元素的出现位置
println(set.indexOf("Go"))
//将每个集合元素映射成新值,返回所有新值组成的Set集合
val mappedList = set.map { "学习" + it + "编程" }
println(mappedList)
//获取最大值
println(set.max())
//获取最小值
println(set.min())
//反转集合顺序
val reversedList = set.reversed()
println(reversedList)
val bSet = setOf("Lua", "Erlang", "Kotlin")
//计算两个集合的交集
println(set intersect bSet)
//计算两个集合的并集
println(set union bSet)
//集合相加,相当于并集
println(set + bSet)
//集合相减,减去公共的元素
println(set - bSet)
(3)set遍历
set遍历和数组一样,可以用for in循环进行遍历。
//创建不可变集合,返回值是Set
val set = setOf("Java", "Kotlin", "Go")
for (str in set){
println(str)
}
此外还可以使用foreach来遍历
set.forEach({println(it)})
(4)可变的set
通过add方法添加单个元素
//创建不可变集合,返回值是Set
val set = mutableSetOf<String>("Java", "Kotlin", "Go")
set.add("111");
还可以通过addAll批量添加元素
set.addAll(setOf("1","2","3"))
同样的提供了删除元素的方法,remove和removeAll
此外还能将两个set取交际,retainAll
通过clear清除所有元素
(5)iterator
和java的集合一样都有iterator, iterator有三个方法,分别是hasNext,next以及remove。
val set = mutableSetOf<String>("Java", "Kotlin", "Go")
val iterator=set.iterator()
while (iterator.hasNext()){
val string=iterator.next()
iterator.remove()
}
2.3 List类型
(1)声明和创建
和set相同,也可以分为可变和不可变。
和set唯一不同的是,新增了一个方法 listOfNotNull(),它返回的也是不可变的list,和listOf的区别是会自动去除输入参数的null值
(2)常用方法
val list=listOfNotNull(1,2,2,null,3)
//返回第一个该元素的所在索引
println(list.indexOf(2))
返回最后一个该元素的所在索引
println(list.lastIndexOf(2))
//返回包含第0到第2索引的元素的子list
println(list.subList(0,2))
(3)可变的list
除了可变set中的方法以外,还提供了一些根据索引增删元素的方法。
//在索引1增加元素2
list.add(1,2)
//删除索引2的元素
list.removeAt(2)
//将索引0的元素改为0
list[0]=0
3.Map
和java中相同,map也是存储key-value的键值对。
(1)声明和创建
有mapOf、mutableMapOf、hashMapOf、linkedMapOf、sortMapOf 除了第一个意外,后面返回的都是可变的map。
mapOf和mutableMapOf返回的是linkedHashMap
hashMapOf返回的是hashmap
linkedMapOf返回的是linkedHashMap
sortMapOf返回的是TreeMap
(2)map的遍历
map遍历有几种方式
可以同时遍历key-value
//en是一个key-value的键值对
for (en in map.entries){
println(en)
}
也可以分别遍历key和value
for (key in map.keys) {
println(key)
}
for (value in map.values) {
println(value)
}
同时也能使用foreach循环
map.forEach({ println("${it.key},${it.value}")})