Kotlin——集合

作者: So_ProbuING | 来源:发表于2023-09-23 14:08 被阅读0次

    Kotlin的集合类同样由两个接口派生:Collection和Map
    Kotlin集合与Java集合不同,Java集合都是可变集合。Kotlin集合可以分为可变集合和不可变集合。只有可变集合才能添加、删除、修改元素,不可变集合只能读取元素
    Kotlin为可变集合创建了一个接口MutableCollection

    Kotlin在JVM平台上并未真正实现HashSet、LinkedHashSet、ArrayList这些类,只是为Java的HashSet、LinkedHashSet、ArrayList指定了一个类型别名而已。这样就可以直接借用Java的这些集合类,Kotlin为这些集合类扩展了更多的方法

    Set集合

    Set集合:集合元素不允许重复

    声明和创建Set集合

    Kotlin并没有真正为JVM平台实现任何Set集合类,只是通过别名借用了Java集合框架的类。因此推荐使用Kotlin提供的工具函数来创建Set集合

    setOf():该函数返回不可变的Set集合
    mutableSetOf():该函数返回可变的MutableSet集合
    hashSetOf():返回可变的HashSet集合
    linkedSetOf() 返回可变的LinkedHashSet集合
    sortedSetOf() 返回可变的TreeSet集合
    emptySet<T>() 用于创建没有任何元素的set集合

     //创建不可变集合 set
        val set = setOf<Int>(1,2,3,4,5)
        //创建可变集合
        val mutSet = mutableSetOf(1,2,3,4)
        println(mutSet)
        println("Set实际返回的集合${set.javaClass}")
        println("mutableSet实际返回的集合${mutSet.javaClass}")
        //创建hashSet集合
        val hashSetOf = hashSetOf(1,2,3,4,5)
        //linkedhashset
        var linkedSetOf = linkedSetOf(1, 2, 3, 4, 5, 6)
        var sortedSetOf = sortedSetOf(1, 3, 6, 7, 8, 2)
        println(sortedSetOf)
    

    注意:这里Kotlin的4个工具函数创建的Set集合都能维护元素的顺序,其中setOf()、mutableSetOf()、linkedSetOf()创建的Set集合能维护元素的添加顺序,sortedSetOf()函数创建的Set集合会按照大小对元素排序
    如果希望Set集合无序,只有通过hashSetOf()函数创建Set集合才行。

    使用Set集合

    • all 判断是否所有集合元素都满足指定规则
    • any 判断是否任一元素都满足指定规则
    • associate 根据Set集合生成Map集合
    • drop 按规则去除集合的部分元素
    • filter 过滤
    • find 查找
     var set = setOf("java","c","c++","VB")
        //判断是否所有的set集合元素都大于4
        println(set.all { it.length > 4 })
        //判断是否任一的set集合元素大于4
        println(set.any { it.length > 4 })
        //以lambda表达式的值为key 集合元素为value 组成map集合
        var associateBy = set.associateBy { "疯狂${it}讲义" }
        println(associateBy.toString())
        //in !in
        println("java" in set)
        println("kotlin" !in set)
        //对set集合进行过滤 过滤条件为元素包含B
        println(set.filter { "B" in it })
        //查找set集合中包含a的元素 找到返回元素 否则返回null
        val findSet = set.find { "a" in it }
        println(findSet)
        //将set集合所有元素拼接成String
        println(set.fold("") { acc, s -> acc + s })
        //查找set集合中某个元素的出现位置
        println(set.indexOf("java"))
        //map将每个集合元素映射成新值,并返回新值组成的set
        println(set.map { "--!!${it}!!--" })
        //max
        println(set.max())
        //反转集合顺序
        println(set.reversed())
        //交集
        var bset = setOf("Erlang","GO","java")
        println(set intersect bset)
        //并集
        println(set union bset)
        //+ -
        println(set + bset)
        //返回删除set集合前面两个元素后的集合
        val dropSet = set.drop(2)
        println("=======${dropSet}")
    

    遍历Set集合

    Kotlin支持使用for-in循环遍历Set集合

      var books = hashSetOf("疯狂Java","疯狂Android","疯狂IOS","疯狂Go","疯狂Python")
        for (book in books) {
            println(book)
        }
    

    因为setOf()返回的set是有序的,因此可以通过索引来遍历Set集合。Set集合提供了indices方法返回索引的区间

     var books = hashSetOf("疯狂Java","疯狂Android","疯狂IOS","疯狂Go","疯狂Python")
        for (i in books.indices){
            println(books.elementAt(i))
        }
    

    可变的Set

    使用mutableSetOf()、hashSetOf()、linkedSetOf()、sortedSetOf()函数返回的集合都是可变的,可变集合可以对该集合的元素执行添加、删除操作

    添加元素

    • add(element:E) 添加元素到set集合中
    • addAll(elements:Collection<E>) 批量添加一个集合到集合中
     //创建一个可变集合
        val mutableSetOf = mutableSetOf("疯狂C")
        //添加一个元素
        mutableSetOf.add("疯狂java")
        //批量添加一个集合到set集合中
    
        mutableSetOf.addAll(setOf("Java","Kotlin"))
        println(mutableSetOf)
    

    删除元素

    • remove(element:E)删除指定元素,删除成功返回true
    • removeAll(elements:Collection<E>)批量删除Set集合的多个元素
    • retainAll(elements:Collection<E>)只保留set集合中与elements集合共有的元素
    • clear():清空集合
    var languages = mutableSetOf("java","c","c++","python","go","Ruby")
        //删除c++
        languages.remove("c++")
        //批量删除
        languages.removeAll(setOf("java","c"))
        println(languages)
        //清空集合
        languages.clear()
    

    可变集合返回的Iterator对象,提供了一个remove方法,该方法可用于在遍历时删除元素

     var languages = mutableSetOf("java", "c", "c++", "python", "go", "Ruby")
        var it = languages.iterator()
        while (it.hasNext()) {
            var e = it.next()
            //删除元素
            if (e.length < 3) {
                it.remove()
            }
        }
        println(languages)
    

    List集合

    Kotlin并未真正实现List集合,只是通过别名借用了Java体系中的ArrayList集合

    声明和创建List集合

    • listOf() 该函数返回不可变的List集合
    • listOfNotNull() 该函数返回不可变的List集合,该函数会自动去掉传入的一系列中的null中。
    • mutableListOf() 该函数返回可变的MutableList集合
    • arrayListOf() 该函数返回可变的ArrayList集合
    • emptyList<T>():创建没有任何元素的List集合
     val list = listOf("Java", "Kotlin", null, "Go")
        val list1 = listOfNotNull("Java", "Kotlin", null, "Go")
        val mutableList = mutableListOf("Java", "Kotlin", null, "Go")
        println(list.javaClass)
        println(mutableList.javaClass)
        val arrayListOf = arrayListOf("Java", "Kotlin", null, "Go")
        println(arrayListOf.javaClass)
    

    list的初始化函数
    有一个接受 List 的大小与初始化函数的构造函数,该初始化函数根据索引定义元素的值。

    var listEmp = List(3,{0})
    

    使用List的方法

    Set集合支持的操作 List集合一般都支持,除此之外它还增加了通过索引操作集合元素的方法

    • get: 带operator修饰的方法,因此可用[]运算符访问集合元素
    • indexOf:返回集合元素在List中的索引
    • lastIndexOf:返回集合元素在List中最后一次出现的位置
    • subList:返回List集合的子集合
     val list = listOf("Java", "Kotlin", null, "Go")
        for (i in list.indices){
            println(list[i])
        }
        //获取指定元素出现的位置
        println(list.indexOf("Kotlin"))
        //获取List的子集合
        println(list.subList(1, 3))
    

    可变的List

    使用mutableListOf()、arrayListof()返回的List集合都是可变的,创建可变List集合后,就可以对List的元素执行添加、插入、删除、替换操作

      var mutableList = mutableListOf("kotlin",null,"go","java")
        //向list集合中插入
        mutableList.add(2,"C++")
        //删除索引为1的元素
        mutableList.removeAt(1)
        //删除"go"元素
        mutableList.remove("go")
        //将索引1处的元素替换为Basic
        mutableList[1]= "Basic"
        //清空集合
        mutableList.clear()
    

    Map集合

    Kotlin的Map集合也分为可变和不可变,同样的Kotlin并没有真正为JVM平台实现任何Map集合类,只是通过别名借用了Java集合框架的类

    声明和创建Map集合

    • mapOf():该函数返回不可变的Map集合
    • mutableMapOf():该函数返回可变的MutableMap集合
    • hashMapOf()返回可变的HashMap集合
    • linkedMapOf()返回可变的LinkedHashMap集合
    • SortedMapOf()返回可变的TreeMap集合
      var map = mapOf("java" to 1,"c" to 2,"c++" to 3)
        //可变map集合
        var mutableMapOf = mutableMapOf("java" to 11, "c" to 22, "c++" to 33)
        println("mapOf返回的类型${map.javaClass}")
        println("mutableMapOf类型${mutableMapOf.javaClass}")
        var hashMap = hashMapOf("a" to 1,"b" to 2,3 to "c")
        var linkedMap = linkedMapOf("a" to 1,"b" to 2,3 to "c")
        var treeMap = sortedMapOf("1" to 1,"2" to 2,"3" to 3)
    

    Kotlin需要使用to指定key-value对,其中to之前的是key,to之后的是value

    使用Map的方法

      //判断map集合中是否有一对 键的长度大于4 值大于10
        var mapAll = map.all { it.key.length > 4 && it.value > 10 }
        var mapAny = map.any { it.key.length > 4 && it.value > 10 }
        //判断是否存在在map中
        println("java" in map)
        println("Go" !in map)
        //对map进行过滤 要求包含a
        println(map.filter { "a" in it.key })
        //map映射值
        println(map.map { "测试${it.key} 值为${it.value}" })
    

    遍历Map

    Map集合由多个key-value组成,因此遍历Map集合即可以通过对key-value对进行遍历,也可以先遍历key,再通过Key来获取对应的value进行遍历
    Map也可以直接用for-in循环进行遍历,这时循环变量的类型是Entry

      var map = mapOf("java" to 1,"c" to 2,"c++" to 3,"vb" to 100,"docker" to 200,"a" to 4,"Go" to 5)
        //key-value对进行遍历
        for(en in map.entries){
            println("${en.key}${en.value}")
        }
        //先遍历map的key再通过key获取value
        for(key in map.keys){
            println("${key}${map.get(key)}")
        }
        //直接使用for-in遍历
        for ((key,value) in map) {
            println(key)
            println(value)
        }
        //lambda foreach遍历
        map.forEach({ println("${it.key}value:${it.value}") })
    

    可变的Map

    mutableMapOf()、hashMapOf()、linkedMapOf()、sortedMapOf()函数返回的集合都是可变的
    可变的Map为操作key-value提供了如下的方法:

    clear():清空所有的key-value
    put(key:K,value:V)存储key-value对
    putAll(from:Map<out K,V>):批量放入多个key-value对
    remove(key:K)删除key-value对
    set(key,value) => map[key]=value

     var mutableMap = mutableMapOf("java" to 1,"c" to 2,"c++" to 3,"vb" to 100,"docker" to 200,"a" to 4,"Go" to 5)
        mutableMap.put("Erlang",1000)
        mutableMap.remove("Erlang")
        mutableMap["hahha"]=22
        println(mutableMap)
    

    相关文章

      网友评论

        本文标题:Kotlin——集合

        本文链接:https://www.haomeiwen.com/subject/veyxbdtx.html