zoukankan      html  css  js  c++  java
  • Kotlin集合——Set集合

    Kotlin集合——Set集合

    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。

  • 相关阅读:
    BZOJ 3132: 上帝造题的七分钟 树状数组+差分
    PAT Advanced 1006 Sign In and Sign Out (25 分)
    PAT Advanced 1011 World Cup Betting (20 分)
    PAT Basic 1032 挖掘机技术哪家强 (20 分)
    PAT Basic 1028 人口普查 (20 分)
    PAT Basic 1004 成绩排名 (20 分)
    大数据数据库HBase(二)——搭建与JavaAPI
    PAT Advanced 1009 Product of Polynomials (25 分)(vector删除元素用的是erase)
    PAT Advanced 1002 A+B for Polynomials (25 分)(隐藏条件,多项式的系数不能为0)
    PAT Basic 1041 考试座位号 (15 分)
  • 原文地址:https://www.cnblogs.com/it-tsz/p/11651544.html
Copyright © 2011-2022 走看看