kotlin 数组、集合和 Map 的使用

举报
半身风雪 发表于 2022/06/24 11:58:35 2022/06/24
【摘要】 @[TOC](kotlin 数组、集合和 Map 的使用) 前言使用纯代码 加 注释的方式,可以更快的理解源码如果你喜欢,请点个赞,后期会不断的深入讲解 1、List 创建与元素获取 val list = listOf("张三","大漂亮","王美丽","王五")// 正常取值方式: 索引, 内部是运算符重载 [] = get println(list[0]) pri...

@[TOC](kotlin 数组、集合和 Map 的使用)


前言

使用纯代码 加 注释的方式,可以更快的理解源码
如果你喜欢,请点个赞,后期会不断的深入讲解


1、List 创建与元素获取

   val list = listOf("张三","大漂亮","王美丽","王五")

//    正常取值方式: 索引, 内部是运算符重载 [] = get
    println(list[0])
    println(list[1])
    println(list[2])
    println(list[3])
  //  println(list[4])     //  下标越界崩溃     Index 4 out of bounds for length 4

//    kotlin 中,可以使用 getOrElse 和 getOrNull ,解决空指针异常,下标越界的崩溃异常
//    getOrElse 在取值越界的时候,会直接返回{"啊呀,你越界了,我出来了哦"} 括号里面定义的参数
    println(list.getOrElse(0){"你没有越界,我不会出来的"})
    println(list.getOrElse(4){"啊呀,你越界了,我出来了哦"})

//    getOrNull 在下标越界的时候,会返回一个null ,我们可以 + 空合并操作符, 使其返回一个字符
    println(list.getOrNull(0))
    println(list.getOrNull(4))


    println(list.getOrNull(4) ?: "没错,就是这里越界了,我使用空合并操作符出来了")

2、可变List 集合


//    不可变集合
    val list1 = listOf("张三","大漂亮","王美丽","王五")
    println(list1)
//    可变集合
    val list2 =  mutableListOf("张三","大漂亮","王美丽","王五")
    list2.add("tiger")
    list2.remove("王五")
    println(list2)
//    不可变集合 to 可变集合
    val list3 = list1.toMutableList()
    list3.remove("大漂亮")
    list3.add("tiger")
    println(list3)

//    可变集合 to 不可变集合
    val list4 = list2.toList()
//    list4.add     没有添加和删除方法
    println(list4)

3、mutator 函数

    val list2 =  mutableListOf("张三","大漂亮","王美丽","王五")
//    mutator 的特性 += -= 其实背后就是 运算符重载而已
    list2 += "tiger"
    list2 += "tt"
    list2 -= "tt"
    println(list2)

//    removeIf
  //  list2.removeIf{true}    //  如果返回的值是 true ,list2 就会自动遍历整个可变集合,一个一个的移除所有的数据
    list2.removeIf{it.contains("t")}   // 过滤集合中的所有元素,只要包含 t  的数据元素,就会被移除

    println(list2)

4、List 集合遍历 三种常用方式


    val list2 = mutableListOf("张三", "大漂亮", "王美丽", "王五")
//    1、 for 循环遍历
    for (i in list2) {
        print("元素是: $i  ")
    }
    println()
//    2、forEach 遍历
    list2.forEach {
        print("元素是: $it")
    }
    println()
//    3、forEachIndexed 获取下标和元素的遍历
    list2.forEachIndexed { index, item ->
        print("下标是:$index, 元素是:$item")
    }

5、结构语法过滤

    val list2 = mutableListOf("张三", "大漂亮", "王美丽", "王五")
//  集合配合结构语法
    val (v1, v2, v3) = list2
    println(v1)
    println(v2)
    println(v3)

//    val 是只读的数据遍历,可以使用var 修改结构出来的数据
    var (v11, v22, v33) = list2
    v22 = "tiger"
    println(v1)

//    也可以使用 _ 符号,来屏蔽你不需要的接收值,算是数据优化,可以优化内存
    val (_, v222, v333) = list2
    println(v222)
    println(v333)

6、set 集合

set 集合,元素不能重复

//    set 集合,元素不能重复
    val set = setOf("张三", "大漂亮", "王美丽", "王五", "大漂亮")
//    set 集合普通的取值方式
//    set[0]      在set 中,没有[] 这样的功能, 取set 的集合值
    set.elementAt(0)
//    set.elementAt(5)        这里会越界崩溃
//    set 集合 和list 集合一样,给我们提供了一种有效的取值方式,可以避免下标越界等情况的出现
    set.elementAtOrElse(0){"不越界,我就不会出来"}
    set.elementAtOrElse(6){"越界了哦,我出来啦"}
    set.elementAtOrNull(0)
    set.elementAtOrNull(6) ?: "越界啦,你返回了null,空合并操作符,让我出来和你见面"

7、可变的set 集合

//    list 中,有可变的集合,set 当然也会有啦。包括集合转变什么的,参照list 就可以
    val set = mutableSetOf("张三", "大漂亮", "王美丽", "王五", "大漂亮")
    set.add("tiger")
    set.remove("王五")
    set.removeIf{
        it.contains("王")
    }

    println(set)

8、集合转换与快捷函数

    val list = mutableListOf("张三", "大漂亮", "王美丽", "王五", "大漂亮")
//    list 转set 去重
    println(list.toSet())
//    list 转set 去重,再转回list
    println(list.toSet().toList())
//    使用快捷去重函数 distinct 
    println(list.distinct())    // 其实就是内部封装了一下,先把List 转换成 可变长度的set 再转换成list ,和上面的操作是一样的
    
    

9、数组类型

在kotlin 语言中,各种数组类型,虽然使用的是引用类型,背后可以编译成Java 基本类型

IntArray         intArrayOf
DoubleArray      doubleArrayOf
LongArray        longArrayOf
ShortArray       shortArrayOf
ByteArray        byteArrayOf
FloatArray       floatArrayOf
BooleanArray     booleanArrayOf
Array<对象类型>   arrayOf    对象数组

    val intArray = intArrayOf(1, 23, 32, 5, 2, 3)
//    其实数组和之前说的集合都是一样的,简单的,不再赘述
    intArray[3]
//    intArray[7]    下标越界,

    intArray.elementAtOrElse(3) { -1 }
    intArray.elementAtOrNull(66) ?: -1

//    list 集合转数组
    val set = intArray.toSet()
    println(set)

//    Array<对象数组>

    val array = arrayOf(File("文件路径"), File("文件路径"), File("文件路径"))
    println(array)

10、Map 的创建

//    在kotlin 中,下面两种创建map 的方式,其实是等价的
    val map = mapOf("tiger" to "111", "ss" to "333")
    val map1 = mapOf(Pair("tiger", "111"), Pair("tiger2", ""))
    

11、读取Map 的值


    val map = mapOf("tiger" to 122, "tiger2" to 333)
    
//    方法一 找不到会返回一个null
    println(map["tiger"])
    println(map["tiger333"])     //  返回null
//    方法二 和数组集合是一样的
    println(map.getOrElse("tiger") {-1})
    println(map.getOrElse("tiger222") {-1})     //找不到会返回-1
    
//    方法三 getOrDefault
    println(map.getOrDefault("tiger", -1))
    println(map.getOrDefault("tiger4444", -1))  //找不到会返回-1
//    方法四  getValue
    println(map.getValue("tiger"))
    println(map.getValue("tiger666"))      //找不到会直接崩溃

12、Map 的遍历

    val map = mapOf(Pair("tiger", 12), Pair("tiger2", 34), Pair("tiger3", 44), Pair("tiger4", 66))


//    第一种
    for (i in map){
        println(i)
        println(i.key)
        println(i.value)
    }

//    第二种
    map.forEach{
//         这个it 包含了 key value
        println(it)
        println(it.key)
        println(it.value)
    }

13、可变的Map 集合

  val map = mutableMapOf(Pair("tiger", 12), Pair("tiger2", 34), Pair("tiger3", 44), Pair("tiger4", 66))

//    其实就和集合数组一样的操作
//    可变集合的操作 -= += [] put
    map += "tiger222" to 322
    map -= "tiger222"
    map["dddd"] = 3000
    map.put("ssss", 333)

    println(map)

//    getOrPut 没有传入的 tiger555 key的话,他会把这个数据,插入进整个集合

    println(map.getOrPut("tiger555") { 7777 })
    //    getOrPut 当需要获取的key,在集合中找到了,就直接获取集合中的对应的value 值

    println(map.getOrPut("tiger555") { 999 })

总结

🤩
🎉 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下}

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!}

🌟 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!}

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。