Kotlin集合——Set集合

作者: 程序员丶星霖 | 来源:发表于2019-07-04 10:06 被阅读11次

    Kotlin的集合类由两个接口派生:Collection和Map

    Kotlin的集合分为两大类:可变集合和不可变集合。只有可变集合才能添加、删除、修改元素,不可变集合只能读取元素。

    Kotlin的Collection集合和Set集合的功能基本相同,Set集合只是为Collection集合增加了额外的限制:集合元素不允许重复

    一、声明和创建

    Kotlin提供了如下函数来创建Set集合。

    • setOf():该函数返回不可变的Set集合。该函数可以接受0个或多个参数,这些参数将作为集合的元素。
    • mutableSetOf():该函数返回可变的MutableSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
    • hashSetOf():该函数返回可变的HashSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
    • linkedSetOf():该函数返回可变的LinkedHashSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
    • sortedSetOf():该函数返回可变的TreeSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
        //创建不可变集合,返回值是Set
        var set = setOf("Java", "Kotlin", "Go")
        println(set)//集合元素按添加顺序排列
        //创建可变集合,返回值是MutableSet
        var mutableSet = mutableSetOf("Java", "Kotlin", "Go")
        println(mutableSet)//集合元素按添加顺序排列
        println("setOf返回对象的实际类型:${set.javaClass}")
        println("mutableSetOf返回对象的实际类型:${mutableSet.javaClass}")
        //创建HashSet集合
        var hashSet = hashSetOf("Java", "Kotlin", "Go")
        println(hashSet)//不保证元素的顺序
        //创建LinkedHashSet集合
        var linkedHashSet = linkedSetOf("Java", "Kotlin", "Go")
        println(linkedHashSet)//集合元素按添加顺序排列
        //创建TreeSet集合
        var treeSet = sortedSetOf("Java", "Kotlin", "Go")
        println(treeSet)//集合元素由小到大排列
    

    输出结果:

    [Java, Kotlin, Go]
    [Java, Kotlin, Go]
    setOf返回对象的实际类型:class java.util.LinkedHashSet
    mutableSetOf返回对象的实际类型:class java.util.LinkedHashSet
    [Go, Java, Kotlin]
    [Java, Kotlin, Go]
    [Go, Java, Kotlin]
    

    二、使用Set的方法

        //创建不可变集合,返回值是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)
    

    输出结果:

    false
    true
    {学习Java语言=Java, 学习Kotlin语言=Kotlin, 学习Go语言=Go}
    true
    false
    [Go]
    [Kotlin]
    Kotlin
    JavaKotlinGo
    2
    [学习Java编程, 学习Kotlin编程, 学习Go编程]
    Kotlin
    Go
    [Go, Kotlin, Java]
    [Kotlin]
    [Java, Kotlin, Go, Lua, Erlang]
    [Java, Kotlin, Go, Lua, Erlang]
    [Java, Go]
    

    Kotlin规定以infix修饰的方法,能以运算符的方式进行调用。

    三、遍历Set

    Kotlin也支持使用for-in循环遍历Set,与遍历数组的方式基本相同。

        var languages = setOf("Java", "Kotlin", "Python")
        for (language in languages) {
            println(language)
        }
    

    输出结果:

    Java
    Kotlin
    Python
    

    Set集合可使用接口中定义的forEach()方法来遍历集合。

        var languages = setOf("Java", "Kotlin", "Python")
        languages.forEach { println(it) }
    

    输出结果:

    Java
    Kotlin
    Python
    

    由于setOf()方法返回的Set集合是有序的,所以可以通过索引来遍历Set集合,Set集合提供了indices方法返回其索引的区间。

        var languages = setOf("Java", "Kotlin", "Python")
        for (i in languages.indices) {
            println(languages.elementAt(i))
        }
    

    输出结果:

    Java
    Kotlin
    Python
    

    四、可变的Set

    setOf()函数返回的额集合是不可变集合;使用mutableSetof()、hashSetOf()、linkedSetOf()、sortedSetOf()函数返回的集合都是可变的。

    4.1、添加元素

    Set提供了add(element:E)方法来添加元素,每调用该方法一次,就会向Set中添加一个元素,Set的长度也会自动加1.

    提供了addAll(elements:Collection<E>)方法来批量添加多个元素。

        //定义一个可变的Set
        var languages = mutableSetOf("Java")
        //添加一个元素
        languages.add("Go")
        languages.add("Lua")
        println(languages)
        println(languages.count())
        languages.addAll(setOf("Swift", "Kotlin"))
        println(languages)
    

    输出结果:

    [Java, Go, Lua]
    3
    [Java, Go, Lua, Swift, Kotlin]
    

    4.2、删除元素

    Set提供了如下方法来删除元素:

    • remove(element:E):删除指定元素,删除成功则返回true。
    • removeAll(elements:Collection<E>):批量删除Set集合中的多个元素。
    • retainAll(elements:Collection<E>):只保留Set集合中与elements集合共有的元素。
    • clear():清空集合。
        //定义一个可变的Set
        var languages = mutableSetOf("Java", "OC", "PHP", "Perl", "Ruby", "Go")
        //删除"PHP"
        languages.remove("PHP")
        //再次删除"Perl"
        languages.remove("Perl")
        println(languages)
        //批量删除多个元素
        languages.removeAll(setOf("Ruby", "Go"))
        println(languages)
        //清空Set集合
        languages.clear()
        println(languages.count())
    

    输出结果:

    [Java, OC, Ruby, Go]
    [Java, OC]
    0
    

    Kotlin的MutableIterator才相当于Java的Iterator。

    学海无涯苦作舟

    我的微信公众号.jpg

    相关文章

      网友评论

        本文标题:Kotlin集合——Set集合

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