从零学习Kotlin之数组和集合

数组和集合

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}")})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值