Kotlin實戰指南一:集合

轉載請標明出處:https://blog.csdn.net/zhaoyanjun6/article/details/87781732
本文出自【趙彥軍的博客】


集合

List是有順序的數據結構,在Kotlin中提供了類似數組的訪問方式:

創建集合

//創建一個空的list集合,相當於 new ArrayList()
var list = mutableListOf<String>()

//創建一個有初始值的list集合,相當於 CollectionsKt.mutableListOf(new String[]{"a", "b", "c"})
var list = mutableListOf("a","b","c")

//獲取值
//方式一:獲取第1個數據,相當於 list.get(0)
var data = list[0]

//方式二:
var data = list.get(0)

//添加值
list.add("d")
list.add(1,"e")

其他的集合操作也類似

//創建一個空的map集合,相當於 new LinkedHashMap()
var map = mutableMapOf<String,String>()

//創建一個空的set集合,相當於 new LinkedHashSet()
var set = mutableSetOf<String>()

一、listOf()函數

Collection.kt定義了三個參數不同的listOf()函數,可以方便地創建一個不可變的List:

fun <T> listOf(): List<T>
fun <T> listOf(T): List<T>
fun <T> listOf(vararg T): List<T>
  • 第一個無參的listOf()函數返回空的List,它直接調用同一文件內定義的emptyList()函數,該函數返回一個單例對象EmptyList。EmptyList是List接口的實現類,可以代表所有類型的空列表。
  • 第二個listOf()函數產生一個只有一個元素的不可變列表,它直接調用java.util.Collections類的singletonList()方法。
  • 第三個lisOf(),接受可變數量的T類型元素並生成包含這些元素的列表。傳入一個T類型的數組,如果長度爲0就返回空列表,否則 就將數組轉換爲列表。

二、mutableListOf()函數

listOf()函數可以創建不變的List,要想創建可變的List,可以使用mutableList()函數:
inline fun mutableListOf(): MutableList = ArrayList()

fun mutableListOf(vararg elements: T): MutableList<T> {
  if(elements.size == 0) {
    return ArrayList()
  } else {
    return ArrayList(ArrayAsCollection(elements, isVarargs = true))
  }
}

inline關鍵字定義了內聯函數,會在編譯時展開到調用處,提高性能。
Kotlin的集合框架只定義了接口,具體實現類都是直接調用Java類。mutableListOf()返回一個ArrayList對象。

三、arrayListOf()函數

arrayListOf()函數用來創建可變的ArrayList,有兩個參數不同的重載形式:
inline fun arrayListOf(): ArrayList = ArrayList()

fun <T> arrayListOf(vararg elements: T): ArrayList<T> {
  if(elements.size == 0) {
    return ArrayList()
  } else {
    return ArrayList(ArrayAsCollection(elements, isVarargs = true))
  }
}

這個函數的實現與mutableListOf()完全一樣,唯一的不同在於返回的類型不同。arrayListOf()返回ArrayList,是一個Java的ArrayList類型,所以是可變的。

四、listOfNotNull()函數

以上的函數都是可以接受null作爲元素的,這與Java中的List是不同的。而這個方法會把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()

這兩個函數都接受可空的T?類型參數,返回剔除所有null值的List。
第二個函數調用的Array<out T?>.filterNotNull()函數,會先新建一個ArrayList,然後遍歷數組內的所有元素,如果不是null就添加到ArrayList裏,最後返回ArrayList。

例子

var list = mutableListOf("a", "b", null)
Log.e("zhao","list:" + list)   //輸出結果:[a, b, null]

var list2 = listOfNotNull("a", "b", null)
Log.e("zhao","list no null :" + list2)  //輸出結果:[a, b]

五、binarySearch()函數

Collections.kt文件中提供了四個針對List的binarySearch()函數,它們可以對列表進行二分查找:

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): Int

inline 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) }
  • 函數需要提供一個Comparator比較器,與java.util.Arrays.binarySearch()相同;
  • 函數需要提供一個(T)->Int類型的函數,用來比較列表內的元素,可以視爲傳入一個compareTo()函數。
  • 函數提供了可空元素的二分查找。
  • 函數需要提供一個(T)-K?類型的函數和一個K?類型的值,它會在列表中用二分查找法尋找符合這個值的元素的索引。

Kotlin提供的幾個binarySearch()函數用法與Java大同小異。

返回結果是Int:

  • 0:查找成功
  • -1:查找失敗

小例子:

//創建一個list
var list = mutableListOf("a", "b")
        
//方式一:從所有的元素中查找a元素,默認開始位置0,結束位置 size
var result = list.binarySearch("a")

///方式二:從指定的元素中查找a元素,默認開始位置0,結束位置 size
var result = list.binarySearch("a",0,list.size)

個人微信號:zhaoyanjun125 , 歡迎關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章