Day09 常用集合以及集合操作符

1螺戳、數(shù)組類型
2、集合類型

1折汞、List
2倔幼、Map
3、Set

3爽待、集合操作符操作符

1凤藏、toMutableList()
2、轉(zhuǎn)換為數(shù)組
3堕伪、轉(zhuǎn)換為集合
4揖庄、操作類
5、順序操作符
6欠雌、映射操作符
7蹄梢、過濾操作符
8、生產(chǎn)操作符
9富俄、統(tǒng)計操作符

一禁炒、數(shù)組類型

幾個常用的方法:

  • arr[index] 的獲取元素。
  • arr.component1() ... arr.component5()獲取數(shù)組的前5個元素霍比。同樣適用與集合幕袱。
  • arr.reverse() 反轉(zhuǎn)元素。
fun main() {
    var arr = arrayOf(1, 2, 3, 4, 5)
    println(arr[0])
    println(arr.component1())
    println(arr.component2())
    arr.reverse()
    for (i in arr) {
        print(i)
    }
}

輸出結(jié)果:


結(jié)果圖

二悠瞬、集合類型

  • Kotlin中的集合和其他語言不同的是们豌,Kotlin集合可分為可變和不可變集合。
     1浅妆、使用List<E>望迎、Set<E>、Map<K,V>聲明的時候該集合則是不可變集合
     2凌外、使用MutableList<E>辩尊、MutableSet<E>、MutableMap<K,V>的時候該集合才是可變類型集合康辑。
  • 在Kotlin中摄欲,集合類型包含三種類型:它們分別是:List轿亮、Set、Map,他們之間存在以下幾個異同點:
     1胸墙、它們都是接口哀托,并不是實際的類。
     2劳秋、它們只實現(xiàn)了 isEmpty()、size胖齐、contains() 等函數(shù)以及屬性玻淑。
     3、List<E>Set<E> 都繼承至Collection<out E>接口,且 Collection<out E> 繼承于 Iterable<out T> 接口呀伙〔孤模 而 Map<K,V> 是獨立出來的一個接口。這一點和Java相同剿另。
     4箫锤、這三種集合類型分別有存在 MutableList<E>、MutableSet<E>雨女、MutableMap<K,V> 接口谚攒,這些接口中提供了改變、操作集合的方法氛堕。例如 add()馏臭、clear()、remove() 等函數(shù)讼稚。
2.1 List

不可變集合:
1括儒、聲明
 使用listOf(..)函數(shù)

fun main() {
    var arr = arrayOf(1, 2, 3, 4, 5)
    var list = listOf(1, 2, 3, 4, 5) //隨意創(chuàng)建
    var list1 = listOf<String>("1", "2", "3", "4", "5") //指定原始的數(shù)值類型
    var list2 = listOf(arr) //可傳入一個數(shù)組
    for(value in list1){
        print("$value \t")
    }

}

可變集合:
1、聲明
 (1) 使用mutableListOf()函數(shù)
 (2) 使用arrayListOf()函數(shù)

    var arr = arrayOf(1, 2, 3, 4, 5)
    var list = mutableListOf(1, 2, 3, 4, 5)
    var list1 = mutableListOf<String>("1", "2", "3", "4", "5")
    var list2 = mutableListOf(arr)
    list1.add("6")
    list1.add("7")
    list1.removeAt(1)
    for (value in list1) {
        print("$value \t")
    }

  var arrayListOf = arrayListOf<Int>(1, 2, 3, 4, 5)
    arrayListOf.add(6)
    for (value in arrayListOf) {
        print("$value \t")
    }
2.2 Map

可變集合:
1锐想、聲明:
 mutableMapOf()函數(shù)

  var mutableMapOf = mutableMapOf<String, String>("name" to "kotlin", "age" to "18")
  mutableMapOf.put("sex","boy")
  mutableMapOf.forEach { t, u -> println("$t"+" : "+"$u") }

  var hashMapOf = hashMapOf<String, String>("a" to "A", "b" to "B")  //同java的hashMap一樣
  hashMapOf.put("c","C")
  hashMapOf.forEach { t, u -> println("$t" + " : " + "$u") }

不可變集合:

1帮寻、聲明:
 mapOf()函數(shù)

    var mapOf = mapOf<Int, String>(1 to "value1", 2 to "value2")
    mapOf.forEach { t, u -> println("$t" + " : " + "$u") }

注意:當我們的鍵存在重復時,集合會過濾掉之前重復的元素赠摇。

2.3 Set

可變集合:

1固逗、聲明:
 setOf()函數(shù)

  var setOf = setOf<String>("1", "1", "2", "3")
  setOf.forEach { println(it) }

不可變集合:
1、聲明:
 mutableSetOf()函數(shù)

   var mutableSetOf = mutableSetOf<Int>(1, 2, 3, 4, 4, 5, 5)
   mutableSetOf.add(6)
   mutableSetOf.forEach { println(it) }

注意 : Set類型集合會把重復的元素去除掉藕帜。

三抒蚜、集合操作符操作符

1、toMutableList()
   將List轉(zhuǎn)換成了MutableList,也成為協(xié)變,此外還有 toList()耘戚、toHashSet()嗡髓、toSet()

    var listOf = listOf<String>("111", "222", "333")
    var mutableList = listOf.toMutableList()
    mutableList.add("444")
    mutableList.forEach { println(it) }

2、轉(zhuǎn)換為數(shù)組
  集合類提供了 toTypedArray 收津,把這個集合根據(jù)調(diào)用集合類相應的高階函數(shù)來轉(zhuǎn)換成相應的數(shù)組饿这。

    var listOf = listOf<String>("111", "222", "333")
    var toTypedArray = listOf.toTypedArray()       //轉(zhuǎn)換
    println(listOf.javaClass.toString())          // 打印listOf的類型
    println(toTypedArray.javaClass.toString())     // 打印toTypedArray的類型

3浊伙、轉(zhuǎn)換為集合
  我們聲明一個集合或者數(shù)組,可以轉(zhuǎn)換成相應類型的集合长捧。調(diào)用toXXX()轉(zhuǎn)換成不可變集合嚣鄙。調(diào)用toMutableXXX()轉(zhuǎn)換為可變集合。集合類提供了toList()串结、toMutableList()哑子、toSet()、toMutableSet()肌割、toHashSet()卧蜓、toMap()等高階函數(shù)去處理。

    var arrayOf = arrayOf("111", "222", "333")
    var toList = arrayOf.toList()
    var toMutableList = arrayOf.toMutableList()
    println("變量arrayOf的類型為:${arrayOf.javaClass}")
    println("變量toList的類型為:${toList.javaClass}")
    println("變量toMutableList的類型為:${toMutableList.javaClass}")

4把敞、操作類

名稱 描述
contains(元素) 檢查集合中是否包含指定的元素
elementAt(index) 獲取對應下標的元素
first() 獲取第一個元素弥奸,若集合為空集合,這會拋出NoSuchElementException異常
last() 同first()相反
indexOf(元素) 返回指定元素的下標奋早,若不存在盛霎,則返回-1
forEach{...} 遍歷元素。一般用作元素的打印
componentX() 這個函數(shù)在前面的章節(jié)中提過多次了耽装。用于獲取元素愤炸。其中的X只能代表1..5。
    var arrayListOf = arrayListOf<Int>(1, 2, 3, 4, 5)
    println("contains(元素) : " + arrayListOf.contains(1))
    println("elementAt(index) : " + arrayListOf.elementAt(2))
    println("first() : " + arrayListOf.first())
    println("last() : " + arrayListOf.last())
    println("indexOf() : " + arrayListOf.indexOf(5))
    arrayListOf.forEach { print(it) }
    println()
    println("componentX() : " + arrayListOf.component4())

5掉奄、順序操作符

名稱 描述
reversed() 反序摇幻。即和初始化的順序反過來。
sorted() 自然升序挥萌。
sortedBy{} 根據(jù)條件升序绰姻,即把不滿足條件的放在前面,滿足條件的放在后面
sortedDescending() 自然降序。
sortedByDescending{} 根據(jù)條件降序。和sortedBy{}相反
   var arrayListOf = arrayListOf<Int>(6, 3, 8, -1, 2, 4)
    println("反轉(zhuǎn) : " + arrayListOf.reversed())
    println("升序 : " + arrayListOf.sorted())
    println("條件升序 : " + arrayListOf.sortedBy { it % 2 == 0 })
    println("降序 : " + arrayListOf.sortedDescending())
    println("條件降序 : " + arrayListOf.sortedByDescending { it % 2 == 0 })

6纽门、映射操作符

名稱 描述
map{...} 把每個元素按照特定的方法進行轉(zhuǎn)換,組成一個新的集合帜矾。
mapIndexed{index,result} 把每個元素按照特定的方法進行轉(zhuǎn)換,只是其可以操作元素的下標(index)屑柔,組成一個新的集合屡萤。
flatMap{...} 根據(jù)條件合并兩個集合,組成一個新的集合掸宛。
groupBy{...} 分組死陆。即根據(jù)條件把集合拆分為為一個Map<K,List<T>>類型的集合。具體看實例
    var arrayListOf = arrayListOf<Int>(6, -3, 8, -1, 2, 4)
    println("map : " + arrayListOf.map { "aa".plus(it) })
    println("mapIndexed{index,result} : " + arrayListOf.mapIndexed { index, i -> index.toString()+"aa" + i })
    println("flatMap : "+arrayListOf.flatMap { listOf(it,"new"+it) })
    println("groupBy : "+arrayListOf.groupBy { if (it>0) "big" else "small"})

7、過濾操作符

名稱 描述
filter{...} 把不滿足條件的元素過濾掉
filterNot{...} 和filter{}函數(shù)的作用相反
take(num) 返回集合中前num個元素組成的集合
takeWhile{...} 循環(huán)遍歷集合措译,從第一個元素開始遍歷集合别凤,當?shù)谝粋€出現(xiàn)不滿足條件元素的時候,退出遍歷领虹。然后把滿足條件所有元素組成的集合返回规哪。
takeLast(num) 返回集合中后num個元素組成的集合
takeLastWhile{...} 循環(huán)遍歷集合,從最后一個元素開始遍歷集合塌衰,當?shù)谝粋€出現(xiàn)不滿足條件元素的時候诉稍,退出遍歷。然后把滿足條件所有元素組成的集合返回最疆。
drop(num) 過濾集合中前num個元素
dropWhile{...} 相同條件下杯巨,和執(zhí)行takeWhile{...}函數(shù)后得到的結(jié)果相反
dropLast(num) 過濾集合中后num個元素
dropLastWhile{...} 相同條件下,和執(zhí)行takeLastWhile{...}函數(shù)后得到的結(jié)果相反
distinct() 去除重復元素
distinctBy{...} 根據(jù)操作元素后的結(jié)果去除重復元素
slice 過濾掉所有不滿足執(zhí)行下標的元素肚菠。
    var arrayListOf = arrayListOf<Int>(6, -3, 8, -1, 2, 4, 4)
    println("filter{...} : " + arrayListOf.filter { it > 0 })
    println("filterNot{...} : " + arrayListOf.filterNot { it > 0 })
    println()
    println("take(num) : " + arrayListOf.take(3))
    println("takeWhile{...} : " + arrayListOf.takeWhile { it > 0 })
    println("takeLast(num) : " + arrayListOf.takeLast(3))
    println("takeLastWhile{...} : " + arrayListOf.takeLastWhile { it > 0 })
    println()
    println("drop{...} : " + arrayListOf.drop(3))
    println("dropWhile{...} : " + arrayListOf.dropWhile { it > 0 })
    println("dropLast{...} : " + arrayListOf.dropLast(3))
    println("dropLastWhile{...} : " + arrayListOf.dropLastWhile { it > 0 })
    println()
    println("distinct() : " + arrayListOf.distinct())
    println("distinctBy() : " + arrayListOf.distinctBy { it + 3 })
    println()
    println("slice :"+arrayListOf.slice(IntRange(2,6)))

8、生產(chǎn)操作符

名稱 描述
plus() 合并兩個集合中的元素罩缴,組成一個新的集合蚊逢。也可以使用符號+
zip 由兩個集合按照相同的下標組成一個新集合。該新集合的類型是:List<Pair>
unzip 和zip的作用相反箫章。把一個類型為List<Pair>的集合拆分為兩個集合烙荷。看下面的例子
partition 判斷元素是否滿足條件把集合拆分為有兩個Pair組成的新集合檬寂。
    var arrayListOf = arrayListOf<Int>(6, -3, 8, -1, 2, 4, 4)
    var subList = arrayListOf<Int>(40, 20, 30)
    val newList = listOf(Pair(1, "Kotlin"), Pair(2, "Android"), Pair(3, "Java"), Pair(4, "PHP"))
    println("plus() : " + arrayListOf.plus(subList))
    println("zip() : " + arrayListOf.zip(subList))
    println(newList.unzip())
    println("partition () : " + arrayListOf.partition { it > 0 })

9终抽、統(tǒng)計操作符

名稱 描述
any() 判斷是不是一個集合,若是桶至,則在判斷集合是否為空昼伴,若為空則返回false,反之返回true,若不是集合,則返回hasNext
any{...} 判斷集合中是否存在滿足條件的元素镣屹。若存在則返回true,反之返回false
all{...} 判斷集合中的所有元素是否都滿足條件圃郊。若是則返回true,反之則返回false
none() 和any()函數(shù)的作用相反
none{...} 和all{...}函數(shù)的作用相反
max() 獲取集合中最大的元素,若為空元素集合女蜈,則返回null
maxBy{...} 獲取方法處理后返回結(jié)果最大值對應那個元素的初始值持舆,如果沒有則返回null
min() 獲取集合中最小的元素,若為空元素集合伪窖,則返回null
minBy{...} 獲取方法處理后返回結(jié)果最小值對應那個元素的初始值逸寓,如果沒有則返回null
sum() } 計算出集合元素累加的結(jié)果。
sumBy{...} 根據(jù)元素運算操作后的結(jié)果覆山,然后根據(jù)這個結(jié)果計算出累加的值竹伸。
sumByDouble{...} 和sumBy{}相似,不過sumBy{}是操作Int類型數(shù)據(jù)簇宽,而sumByDouble{}操作的是Double類型數(shù)據(jù)
average() 獲取平均數(shù)
reduce{...} 從集合中的第一項到最后一項的累計操作佩伤。
reduceIndexed{...} 和reduce{}作用相同聊倔,只是其可以操作元素的下標(index)
reduceRight{...} 從集合中的最后一項到第一項的累計操作。
reduceRightIndexed{...} 和reduceRight{}作用相同生巡,只是其可以操作元素的下標(index)
fold{...} 和reduce{}類似耙蔑,但是fold{}有一個初始值
foldIndexed{...} 和reduceIndexed{}類似,但是foldIndexed{}有一個初始值
foldRight{...} 和reduceRight{}類似孤荣,但是foldRight{}有一個初始值
foldRightIndexed{...} 和reduceRightIndexed{}類似甸陌,但是foldRightIndexed{}有一個初始值
 var arrayListOf = arrayListOf<Int>(1, -1, 1, -1, 1, 2, 3)
    println("any() : " + arrayListOf.any())
    println("any{...} : " + arrayListOf.any { it > 0 })
    println("all{...} : " + arrayListOf.all { it > 0 })
    println()
    println("none() : " + arrayListOf.none())
    println("none{...} : " + arrayListOf.none { it > 0 })
    println()
    println("max() : " + arrayListOf.max())
    println("maxBy{...} : " + arrayListOf.maxBy { it % 3 })
    println()
    println("min() : " + arrayListOf.min())
    println("minBy{...} : " + arrayListOf.minBy { it % 2 })
    println()
    println("sum() : " + arrayListOf.sum())
    println("sumBy() : " + arrayListOf.sumBy { it + 2 })
    println()
    println("average() : " + arrayListOf.average())
    println()
    println("reduce{...} : " + arrayListOf.reduce { acc, i -> acc + i })// acc 是 1,2,3,4,5 i是 和 i+=acc
    println("reduceIndexed{...} : " + arrayListOf.reduceIndexed { index, acc, i -> index + acc + i }) //index是下表 0+1+2+3+4+i(i+=acc)
    println("reduceRight{...} : " + arrayListOf.reduceRight { acc, i -> acc + i })
    println("reduceRightIndexed{...} : " + arrayListOf.reduceRightIndexed { index, acc, i -> index + acc + i })
    println()
    println("fold{...} : " + arrayListOf.fold(1) { result, next -> result + next })
    println("foldIndexed{...} : " + arrayListOf.foldIndexed(1) { index, result, next -> index + result + next })
    println("reduce{...} : " + arrayListOf.foldRight(1) { result, next -> result + next })
    println("foldRightIndexed{...} : " + arrayListOf.foldRightIndexed(1) { index, result, next -> index + result + next })

我尼瑪.好多函數(shù),咋記得過來.

The End.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盐股,隨后出現(xiàn)的幾起案子钱豁,更是在濱河造成了極大的恐慌,老刑警劉巖疯汁,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牲尺,死亡現(xiàn)場離奇詭異,居然都是意外死亡幌蚊,警方通過查閱死者的電腦和手機谤碳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溢豆,“玉大人蜒简,你說我怎么就攤上這事′鱿桑” “怎么了搓茬?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長队他。 經(jīng)常有香客問我卷仑,道長,這世上最難降的妖魔是什么麸折? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任系枪,我火速辦了婚禮,結(jié)果婚禮上磕谅,老公的妹妹穿的比我還像新娘私爷。我一直安慰自己,他們只是感情好膊夹,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布衬浑。 她就那樣靜靜地躺著,像睡著了一般放刨。 火紅的嫁衣襯著肌膚如雪工秩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音助币,去河邊找鬼浪听。 笑死,一個胖子當著我的面吹牛眉菱,可吹牛的內(nèi)容都是我干的迹栓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼俭缓,長吁一口氣:“原來是場噩夢啊……” “哼克伊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起华坦,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愿吹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惜姐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犁跪,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年歹袁,在試婚紗的時候發(fā)現(xiàn)自己被綠了坷衍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡宇攻,死狀恐怖惫叛,靈堂內(nèi)的尸體忽然破棺而出倡勇,到底是詐尸還是另有隱情逞刷,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布妻熊,位于F島的核電站夸浅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扔役。R本人自食惡果不足惜帆喇,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亿胸。 院中可真熱鬧坯钦,春花似錦、人聲如沸侈玄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽序仙。三九已至突颊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背律秃。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工爬橡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棒动。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓糙申,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迁客。 傳聞我的和親對象是個殘疾皇子郭宝,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359