语言学习——kotlin

Kotlin——集合

2023-09-23  本文已影响0人  So_ProbuING

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集合

 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()函数返回的集合都是可变的,可变集合可以对该集合的元素执行添加、删除操作

添加元素

 //创建一个可变集合
    val mutableSetOf = mutableSetOf("疯狂C")
    //添加一个元素
    mutableSetOf.add("疯狂java")
    //批量添加一个集合到set集合中

    mutableSetOf.addAll(setOf("Java","Kotlin"))
    println(mutableSetOf)

删除元素

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集合

 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集合一般都支持,除此之外它还增加了通过索引操作集合元素的方法

 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集合

  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)
上一篇下一篇

猜你喜欢

热点阅读