Kotlin实战指南一:集合
轉(zhuǎn)載請(qǐng)標(biāo)明出處:https://blog.csdn.net/zhaoyanjun6/article/details/87781732
本文出自【趙彥軍的博客】
Kotlin初體驗(yàn)一:集合
- 集合
- 一、listOf()函數(shù)
- 二、mutableListOf()函數(shù)
- 三、arrayListOf()函數(shù)
- 四、listOfNotNull()函數(shù)
- 五、binarySearch()函數(shù)
集合
List是有順序的數(shù)據(jù)結(jié)構(gòu),在Kotlin中提供了類似數(shù)組的訪問(wèn)方式:
創(chuàng)建集合
//創(chuàng)建一個(gè)空的list集合,相當(dāng)于 new ArrayList() var list = mutableListOf<String>()//創(chuàng)建一個(gè)有初始值的list集合,相當(dāng)于 CollectionsKt.mutableListOf(new String[]{"a", "b", "c"}) var list = mutableListOf("a","b","c")//獲取值 //方式一:獲取第1個(gè)數(shù)據(jù),相當(dāng)于 list.get(0) var data = list[0]//方式二: var data = list.get(0)//添加值 list.add("d") list.add(1,"e")其他的集合操作也類似
//創(chuàng)建一個(gè)空的map集合,相當(dāng)于 new LinkedHashMap() var map = mutableMapOf<String,String>()//創(chuàng)建一個(gè)空的set集合,相當(dāng)于 new LinkedHashSet() var set = mutableSetOf<String>()一、listOf()函數(shù)
Collection.kt定義了三個(gè)參數(shù)不同的listOf()函數(shù),可以方便地創(chuàng)建一個(gè)不可變的List:
fun <T> listOf(): List<T> fun <T> listOf(T): List<T> fun <T> listOf(vararg T): List<T>- 第一個(gè)無(wú)參的listOf()函數(shù)返回空的List,它直接調(diào)用同一文件內(nèi)定義的emptyList()函數(shù),該函數(shù)返回一個(gè)單例對(duì)象EmptyList。EmptyList是List接口的實(shí)現(xiàn)類,可以代表所有類型的空列表。
- 第二個(gè)listOf()函數(shù)產(chǎn)生一個(gè)只有一個(gè)元素的不可變列表,它直接調(diào)用java.util.Collections類的singletonList()方法。
- 第三個(gè)lisOf(),接受可變數(shù)量的T類型元素并生成包含這些元素的列表。傳入一個(gè)T類型的數(shù)組,如果長(zhǎng)度為0就返回空列表,否則 就將數(shù)組轉(zhuǎn)換為列表。
二、mutableListOf()函數(shù)
listOf()函數(shù)可以創(chuàng)建不變的List,要想創(chuàng)建可變的List,可以使用mutableList()函數(shù):
inline fun mutableListOf(): MutableList = ArrayList()
inline關(guān)鍵字定義了內(nèi)聯(lián)函數(shù),會(huì)在編譯時(shí)展開到調(diào)用處,提高性能。
Kotlin的集合框架只定義了接口,具體實(shí)現(xiàn)類都是直接調(diào)用Java類。mutableListOf()返回一個(gè)ArrayList對(duì)象。
三、arrayListOf()函數(shù)
arrayListOf()函數(shù)用來(lái)創(chuàng)建可變的ArrayList,有兩個(gè)參數(shù)不同的重載形式:
inline fun arrayListOf(): ArrayList = ArrayList()
這個(gè)函數(shù)的實(shí)現(xiàn)與mutableListOf()完全一樣,唯一的不同在于返回的類型不同。arrayListOf()返回ArrayList,是一個(gè)Java的ArrayList類型,所以是可變的。
四、listOfNotNull()函數(shù)
以上的函數(shù)都是可以接受null作為元素的,這與Java中的List是不同的。而這個(gè)方法會(huì)把null全部剔除掉,返回包含所有非null值的List:
fun listOfNotNull(element: T?): List<T> = if(element != null) listOf(element) else emptyList()fun listOfNotNull(vararg elements: T?): List<T>= elements.filterNotNull()這兩個(gè)函數(shù)都接受可空的T?類型參數(shù),返回剔除所有null值的List。
第二個(gè)函數(shù)調(diào)用的Array<out T?>.filterNotNull()函數(shù),會(huì)先新建一個(gè)ArrayList,然后遍歷數(shù)組內(nèi)的所有元素,如果不是null就添加到ArrayList里,最后返回ArrayList。
例子
var list = mutableListOf("a", "b", null) Log.e("zhao","list:" + list) //輸出結(jié)果:[a, b, null]var list2 = listOfNotNull("a", "b", null) Log.e("zhao","list no null :" + list2) //輸出結(jié)果:[a, b]五、binarySearch()函數(shù)
Collections.kt文件中提供了四個(gè)針對(duì)List的binarySearch()函數(shù),它們可以對(duì)列表進(jìn)行二分查找:
fun <T> List<T>.binarySearch(element: T, comparator: Comparator<in T>, fromIndex: Int = 0, toIndex: Int = size): Int fun <T> List<T>.binarySearch(fromIndex: Int = 0, toIndex: Int = size, comparison: (T) -> Int): Int fun <T: Comparable<T>> List<T?>.binarySearch(element: T?, fromIndex: Int = 0, toIndex: Int = size): Intinline fun <T, K : Comparable<K>> List<T>.binarySearchBy(key: K?, fromIndex: Int = 0, toIndex: Int = size, crossinline selector: (T) -> K?): Int = binarySearch(fromIndex, toIndex) { compareValues(selector(it), key) }- 函數(shù)需要提供一個(gè)Comparator比較器,與java.util.Arrays.binarySearch()相同;
- 函數(shù)需要提供一個(gè)(T)->Int類型的函數(shù),用來(lái)比較列表內(nèi)的元素,可以視為傳入一個(gè)compareTo()函數(shù)。
- 函數(shù)提供了可空元素的二分查找。
- 函數(shù)需要提供一個(gè)(T)-K?類型的函數(shù)和一個(gè)K?類型的值,它會(huì)在列表中用二分查找法尋找符合這個(gè)值的元素的索引。
Kotlin提供的幾個(gè)binarySearch()函數(shù)用法與Java大同小異。
返回結(jié)果是Int:
- 0:查找成功
- -1:查找失敗
小例子:
//創(chuàng)建一個(gè)list var list = mutableListOf("a", "b")//方式一:從所有的元素中查找a元素,默認(rèn)開始位置0,結(jié)束位置 size var result = list.binarySearch("a")///方式二:從指定的元素中查找a元素,默認(rèn)開始位置0,結(jié)束位置 size var result = list.binarySearch("a",0,list.size)個(gè)人微信號(hào):zhaoyanjun125 , 歡迎關(guān)注
總結(jié)
以上是生活随笔為你收集整理的Kotlin实战指南一:集合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 江湖已去,作品长存
- 下一篇: Kotlin实战指南二:变量、常量、静态