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。