kotlin三种常用集合:List、Set和Map

List

通常创建集合和创建变量不同,创建变量时直接声明变量就行

val username = "李云龙"

而创建集合则需要两步:

1、声明集合变量

2、填充集合元素

不过kotlin提供了一个将上面两步合并在一起的函数

比如下面一个亮剑人物名字列表

val nameList:List<String> = listOf("YunLong Li","DeBiao Zhang") //[YunLong Li, DeBiao Zhang]
println(nameList) //[YunLong Li, DeBiao Zhang]

 list声明支持自动类型推断,不过这里指定了类型信息:List<String>

其中尖括号内的部分叫做“参数化类型”,它告诉编译器List中将存放什么类型的元素

List元素只能同一类型,如果在列表中存放其他类型的数据,则会被编译器阻止

list中的元素是基于零索引(zero-indexed)存放的

//打印第一个人名
println(nameList[0]) //YunLong Li
println(nameList.first()) //YunLong Li

索引边界与安全索引取值

按索引获取元素通常需要谨慎操作,因为尝试一不存在的索引值获取元素会触发ArrayIndexOutBoundsException异常
比如上面列表中只有3个元素,而你却取第四个

nameList[4] 
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3

thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3
越界取值会抛出异常,因此,kotlin提供了安全索引取值函数。
安全索引取值函数需要两个参数:索引值和默认值

println(nameList.getOrNull(4))  //返回null值
通常情况下,使用getOrNull函数需要处理null值的情况,如空合并操作符
这种情况下kotlin更加推荐一种自定义结果:
println(nameList.getOrElse(4){"haha,surprise? normally running "}) // 返回自定义结果

检查列表是否存在某个元素:

    if(nameList.contains("YunLong Li")){
        println("Li Yunlong is the leader of our independent regiment")
    }else{
        println("We don't know ")
    }

也支持一次性检查多个元素 


    if(nameList.containsAll(listOf("Yu Tian","YunFei Chu"))){
        println("They're inspecting the loot at the training ground")
    }else{
        println("We don't know them")
    }

更改列表内容

list 创建的列表是无法更改内容的只读列表
只读列表与定义列表变量时的声明val或var无关
var只能送给列表变量重新赋值一个新列表,仍旧无法修改列表内容,包括替换、修改、删除、添加列表元素等操作
只读列表可以有效防止误删除操作

kotlin支持可变性列表

列表可变性是由类别的类型决定的,指的是列表元素是否可以修改
创建可变列表可以使用mutableLostOf函数

val weapon = mutableListOf("Italian Pao","三八 Rifle", "92 Type", "Italian Pao")
println(weapon) //[Italian Pao, 三八 Rifle, 92 Type, Italian Pao]
可变列表支持列表元素的增删改操作
weapon.add("M3 Submachine Gun")

 add也支持将元素插入指定位置

比如战场上新缴获一门意大利炮

weapon.add(0,"Italian Pao")

 要修改一个元素

weapon[1] = "old Italian Pao"

这里的两个add方法其实是两个不同的函数,一个是直接追加元素,一个是按索引位置插入元素 

元素删除

战场上,一门92步枪损毁

删除一把92步枪

weapon.remove("92 Type)

可变列表和只读列表可以互转

weapon.toList() //转为只读列表
nameList.toMutableList() // 转为可变列表

删除一个元素 

比如云飞兄回了国军部队 

nameList.toMutableList().remove("YunFei Chu")

由于之前创建的人物列表是val

所以无法使用nameList = nameList.toMutable()改变人物变量

如果想要,修改变量,需要回头将声明关键字改为var

var nameList = listOf("YunLong Li", "DeBiao Zhang")

kotlin能修改可变列表的函数有个统一的名字mutator

kotlin中一些常用的mutator函数
[] = 元素设置运算符 设置指定索引位置的值,索引越界会抛出异常
add() 默认在列表末尾添加元素,支持指定索引位置
addAll() 向类别中添加另一同类型列表中的全部元素

nameList.addAll(listOf("ZhengWei","YunFeiXiong"))
+= 添加一个新元素或新集合中的全部元素到列表中 ,功能类似add + addAll
nameList += "Yu Tian"
nameList += listOf("ZhengWei","YunFeiXiong")
 -= 删除元素运算符,+=的反向操作
clear()清空列表
removeIf() 基于lambda表达式的条件删除语句
nameList.removeIf{ it.contains( "YunFeiXiong")}
nameList.removeIf{ it.contains( "ShanBenYiMU")} // 如果不存在则不执行
println(nameList)

Set

Set集合在很多方面与List集合相似
list集合允许填充重复元素,而Set集合所有元素具有唯一性
Set集合不支持具有索引的存取汁函数,因为Set集合内元素顺序不固定

如果尝试创建重复元素 集合会自动去重

val weapon = setOf("Italian Pao","三八 Rifle", "92 Type", "Italian Pao")
println(weapon) //[Italian Pao, 三八 Rifle, 92 Type]

多出的一门意大利炮被自动过滤

set也支持使用contains和containsAll函数检查集合是否包含某些元素

println( weapon.contains("三八 Rifle")) // ture
println( weapon.contains("92 Rifle")) // false

因为set集合不会对元素作索引排序,因此无法使用"[]="操作符操作集合元素
不过可以使用内部遍历函数来读取某个位置的元素

println(weapon.elementAt(2)) // 92 Type

由于Set集合的特殊性,读取set集合的元素要比List慢很多。
并且,由于Set没有按索引操作的mutator函数,如add(index,element)等函数
因此,需要基于索引操作元素,最好选择List
而在遇到元素需要唯一,又需要按索引操作元素值这样的需求时

灵活变通才能更好的搬运代码
所以,我们可以创建一个Set,然后将它转换为list

比如将weapon转为可变列表

weapon.toMutableList()

对于已经存在的list,我们要对列表去重可以这样

nameList.toSet().toList()

Kotlin提供了一简便方法

nameList.distinct()

set集合添加元素

val firstName = listOf("YunLong","DaBiao","HeShang","Wei","Yu","YunFei","DaYong") //名字列表
val lastName = listOf("Li","Zhang","Tian","Zhao","Feng","Chu","Kong") //姓列表

默认情况下,set集合也是只读的

我们可以创建一个可变集合

val uniqueName = mutableSetOf<String>() // 定义空集合时,无法使用类型推断,因此必须指定集合中元素类型
(0..20).forEach {
        val first = firstName.shuffled().first()
        val last = lastName.shuffled().first()
        val name = "$first $last"
        uniqueName += name //使用+=向集合追加元素
}
println(uniqueName) //[Yu Li, Wei Li, DaYong Tian, YunLong Li, YunLong Zhao, DaBiao Zhao, Wei Zhao, Yu Feng, Wei Chu, YunLong Feng, HeShang Zhao, Yu Zhao, DaYong Zhao, HeShang Feng, DaBiao Tian, DaBiao Zhang, DaBiao Feng]

Map

类似于List和Set集合,Map也是kotlin中常用的一种集合
它们都是用来存放一组元素,默认只读
使用参数化类型告诉编译器集合元素的类型
不同的是,Map元素是由键值对组成
获取元素的方式是基于Key而不是索引
map中,key具有唯一性,而值是可以重复的

下面定义一个每人可领取的子弹数量

val materials = mapOf("Yu Tian" to 10, "YunLong Li" to 8, "YunFei Cu" to 6)

在map集合中。key必须是同一类型,value也必须是同一类型,key和value可以是不同类型
比如此处map中规定key只能是String,而value只能是double
to看上去像是一个关键字,实际上是一个中继调用,to其实是一个函数 类似这样(“yu”).to(10.5),在这里它返回一个Pair对象
粗了to函数,还可以像这样定义键值对

mapOf(Pair("Yu",10.5),Pair("YunLong",8.0))

如果map中key遇到重复值,则后来的key->value会替换前面的key->value

设置key->value

读取map集合的值

    //读取map集合的值
    println(materials["Yu"]) // 10.5
    println(materials.getValue("YunLong")) // 8.0
    println(materials.getOrElse("YunFei"){ 5.5}) //6.6
    println(materials.getOrDefault("DaBiao", 5.0))

由于mapOf是只读的

所以需要从新创建一个可变map

val materials = mutableMapOf<String, Int>()

然后给上面人物列表每人分配5发子弹

nameList.forEach{
    materials[it] = 5
}
println(materials)

Map支持的一些mutator

添加key value,或更新现有的key value
+=添加或更新key value
put()同+
PutAll()

添加所有传入的key Value 

materials += napOf("erYIngZhang" to 3,...)

getOrPut()

根据获取一个值,如果不存在则添加并返回结果

materials.getOrPut("DaBiao", 5)

remove()

删除一个值

materials.remove("YunFeiXiong")

-

删除指定元素并返回结果

val our = materials - “YUnFeiXiong”

-=

删除指定元素

materials -= “YunFeiXiong”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值