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。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM