Kotlin专题KotlinKotlin编程

Kotlin学习之List集合

2017-12-06  本文已影响392人  程序员丶星霖

Kotlin学习之List集合

List是有顺序的数据结构,在Kotlin中提供了类似数组的访问方式:

// List<out E>
operator fun get(index: Int): E

// MutableList<out E>
operator fun set(index: Int, element: E): E

get()和set()函数重载了操作符后,就可以操作List了:

val list = mutableListOf("Hello", "World")
println(list[0])
// 等价于 println(list.get(0))
list[1] = ""
// 等价于 list.set(1, "")

在Kotlin中,kotlin.collections.Collections.kt文件里定义了几个常用的集合工具函数,主要涉及List部分,如下介绍:

一、listOf()函数

Collection.kt定义了三个参数不同的listOf()函数,可以方便地创建一个不可变的List:

fun <T> listOf(): List<T>
fun <T> listOf(T): List<T>
fun <T> listOf(vararg T): List<T>

二、mutableListOf()函数

listOf()函数可以创建不变的List,要想创建可变的List,可以使用mutableList()函数:

inline fun mutableListOf(): MutableList<T> = ArrayList()

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

三、arrayListOf()函数

arrayListOf()函数用来创建可变的ArrayList,有两个参数不同的重载形式:

inline fun <T> arrayListOf(): ArrayList<T> = ArrayList()

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

四、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()

五、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) }
  1. 函数需要提供一个Comparator比较器,与java.util.Arrays.binarySearch()相同;
  2. 函数需要提供一个(T)->Int类型的函数,用来比较列表内的元素,可以视为传入一个compareTo()函数。
  3. 函数提供了可空元素的二分查找。
  4. 函数需要提供一个(T)-K?类型的函数和一个K?类型的值,它会在列表中用二分查找法寻找符合这个值的元素的索引。

Kotlin提供的几个binarySearch()函数用法与Java大同小异。

学海无涯苦作舟

我的微信公众号.jpg
上一篇下一篇

猜你喜欢

热点阅读