• kotlin基础教程:<5>集合与数组


    上一期我们讲了内置函数的使用,其重点就在于内置函数的it和this,哪一些具有this,哪一些具有it,还有就是返回值,是对象本身还是最后一行;我们在对计算机上的文件进行操作试,可能会一直通过一个对象来点出函数调用,这样的话很繁琐,而这些内置函数的一个链式调用就很好的解决了这个问题,因为都是有返回值的,而且返回的还是对象本身,比如apply函数;

    那么这一期就开始我们会常用的的数据存储这一块,集合和数组,我们就做一个简单介绍然后代码演示,虽然语言简单,但是代码都是很清晰的,大家会用就可以,毕竟学过一门编程语言之后,这些差不多用到的东西还是很好理解的,集合和数组都是用来存放一些数据的,在我们的Android开发过程中会大量用到,所以大家务必要理解这一期的内容:

    list集合

    1、创建:

    含有两种类型,一种是不可变类型,一种是可变类型,可变类型具有add和remove的操作,但是这两者可以相互转化,不管是什么变量,kotlin始终是将类型放在变量名的后面,而且强大的类型推断可以简化很多代码:

    1.    /*
    2.    * list的学习:
    3.    * list含有两种,一种是不可变的(list),一种是可变的(mutablelist)
    4.    * 可变的list具有add和remove操作;遍历它们含有三种常用的方式:增强for,
    5.    * foreach,foreachindexed
    6.    * */
    7.    //1.1 创建list
    8.    //不可变的list
    9.    val list1: List<String> = listOf<String>("孙悟空","猪八戒","沙和尚")
    10.    //可变的,注意后面的mutable首字母小写
    11.    val list2: MutableList<String> = mutableListOf<String>("孙悟空","猪八戒","沙和尚")
    12.    //1.2 简化写法
    13.    /*
    14.    因为kotlin的类型推导,我们完全可以使用简化写法来节省代码
    15.    val list1 = listOf("孙悟空","猪八戒","沙和尚")
    16.    val list2 = mutableListOf("孙悟空","猪八戒","沙和尚")*/
    17.    //1.3 可以变和不可变之间还可以互相转化
    18.    //不可变转可变
    19.    val list3 = list1.toMutableList()
    20.    //可变转不可变
    21.    val list4 = list2.toList()

    可变和不可变就是是否可以对集合进行修改,这里表示的数据添加与删除; 

    2、数据的添加和移除:

    1.    //2.1 可变集合的增删操作
    2.    //添加,第二种独特的添加方式本质上是运算符重载
    3.    list2.add("唐僧")
    4.    list3 += "唐僧"
    5.    //删除
    6.    list2.remove("猪八戒")
    7.    list3 -= "猪八戒"

    这是kotlin的独特之处,是将很多种语言的优势集于一身的语言;可以通过运算符重载的当时来直接使用运算符在对元素进行操作,使用加减等于进行数据的修改 其实效果和add、remove是一样的;

    3、集合的遍历:

    含有三种常用的遍历方式,kotlin大量使用匿名函数:

    1.    //2.2 集合的遍历
    2.    //增强for
    3.    println("增强for遍历:")
    4.    for (s in list1) {
    5.        print("$s ")
    6.   }
    7.    //foreach,主要就是使用it代表每一个元素
    8.    println("foreach遍历:")
    9.    list1.forEach{
    10.        print("$it ")
    11.   }
    12.    //foreachindexed带有下标的遍历
    13.    println("foreachindexed带有下标的遍历")
    14.    /*
    15.    * 因为含有两个参数,前面是下标,后面数数据,
    16.    * 所以我们不能使用it了
    17.    * */
    18.    list1.forEachIndexed{
    19.        index,item ->
    20.        print("下标:${index} 元素:${item} ")
    21.   }

    直接使用匿名函数遍历,因为匿名函数在kotlin里面非常简洁,而且还方便好用;

    4、集合的解构和过滤:

    有时候我们先要一次性拿到所有集合中的元素,而有时候有些元素我们又不想要,就需要使用到我们的解构和过滤了:

    1. //2.3 解构和过滤集合
    2.    //解构,直接用括号传结合表示解构
    3.    val (v1,v2,v3) = list1
    4.    //过滤:使用下划线来过滤掉不需要的数据
    5.    val (_,v4,v5) = list1
    6.    println("v1:${v1} v2:${v2} v3:${v3}")
    7.    println("v4:${v4} v5:${v5} ")

    set集合

    1、创建

    与list一样具有可变和不可变性,当然简便写法也有,我就不演示了:

    1. //2.4 set集合
    2.    /*
    3.    * set集合的创建和遍历使用都差不多,只是set集合可以做到去重操作
    4.    * 就是同一个元素只会出现一次,后面的会覆盖前面的;利用这个特性,
    5.    * kotlin的list可以依靠set来去重,因为它们可以互相转化
    6.    * */
    7.    //创建:同样含有可变和不可变
    8.    //不可变
    9.    val set1: Set<String> = setOf<String>("Tony","hello","Tony")
    10.    println("set1: $set1")
    11.    //可变
    12.    val set2: MutableSet<String> = mutableSetOf<String>("Tony","hello","Tony")

    2、获取元素

    set是不具有[]方式获取的,建议使用下面两种方式获取不会出现越界的错误

    1. /* 不过set不具有[]的方式获取数据,而是通过elementat()获取
    2.   * 其实这个和list的[]差不多,直接获取有时候是会出现数组越界访问
    3.   * 的,set有和list差不多的防止越界访问的机制
    4.   * */
    5.    val str1 = set1.elementAt(0)
    6.    println(str1)
    7.    val str2 = set1.elementAtOrElse(10){"你越界了"}
    8.    val str3 = set1.elementAtOrNull(1)?: {"你越界了"}
    9.    println(str2)
    10.    println(str3)

    3、对于可变集合的添加和删除元素:

    1.    //可变的具有add和remove操作
    2.    set2.add("唐僧")
    3.    set2.remove("hello")
    4.    println(set2)

    4、对于灵活性,就是可以list和set相互转化,达到一个去重的效果:

    1.    //2.5 list 和set 的相互转化
    2.    val set3 = list1.toSet()
    3.    //如果我们需要给list去重的话,就是这样
    4.    list1 = list1.toSet().toList()
    5.    //这样写太繁琐,其实还有简便写法:
    6.    list1 = list1.distinct()
    7.    println(list1)

    array数组

    array数组常用在一些基本的数据类型当中,而且list也可以在一些char、对象和数字类型转换为数组:

    1. //2.6 array数组
    2.    /*
    3.    * 常见的有字符串数组、整型数组、浮点、char、对象数组
    4.    * 其实list是可以转数组的,一般的基本数据类型都有数组
    5.    * */
    6.    //创建:直接写简化写法,类型推断,和集合是一样的
    7.    val array1 = arrayOf(1,2,3,4,5)
    8.    //获取元素:和set一样,不过通过elementatorelse获取的时候提示一定是整型
    9.    val arrayvalue1 = array1.elementAtOrElse(1){-1}
    10.    val arrayvalue2 = array1.elementAtOrNull(10)?: "越界了"
    11.    println(arrayvalue1)
    12.    println(arrayvalue2)
    13.    //list 转数组,只支持char、对象和数字类型
    14.    val array2 = listOf<Char>('a','b').toCharArray()
    15.    println(array2)

    数组的结果是没有中括号的;查找元素的话就和集合差不多,就是在使用elementAtOrElse的时候,后面返回的只能是整型数值;其他是一样的,不支持修改;

    不管是哪一种数据结构,重点就是学习他的创建,获取元素和遍历,三种遍历方式,一般的,创建集合具有可变集合和不可变集合,而且他们灵活到可以互相转换,使用set去重等,内容不多却很重要,大家要多多练习

  • 相关阅读:
    6年Java开发,海投30份简历屡次被拒,该不该换个方向?
    maven 常用知识速记
    FL Studio21.2破解订阅版下载
    【pytest】 参数化@pytest.mark.parametrize
    STM32 HAL库DMA串口发送数据参考文章
    mysql底层是如何存放数据的
    基于Redis实现特殊的消息队列
    Vue项目自动更换BaseUrl
    大厂程序员bibili技术学习分享
    GBase 8c 管理平台(一)-部署配置
  • 原文地址:https://blog.csdn.net/aiwanchengxu/article/details/125452456