多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
集合可以理解为是一个容器,容器操作我们自然想到“增删改查”,集合元素是定长的,所以没有“增”和“删”,我们来看看“改”和“查”。 [TOC] ### **修改元素:下标修改、set方法** 数组修改指定位置元素可以用下标修改、set方法修改。set方法的方法签名如下: ``` publicoperator fun set(index: Int, value: T): Unit ``` 但是需要注意,数组起始位置从0开始,第一个元素的位置为0,第二个元素位置为1,以此类推。 我们演示下数组的修改,参考代码: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3) println("------------下标修改元素-------------") intArr[0] = 4//下标形式 println("修改第一个元素为4:${intArr.toList()}") println("-----------set 方法修改元素------------") intArr.set(1, 5)//方法调用形式 println("修改第二个元素为5:${intArr.toList()}") } ~~~ 运行结果 ``` ------------下标修改元素------------- 修改第一个元素为4:[4, 2, 3] -----------set 方法修改元素------------ 修改第二个元素为5:[4, 5, 3] Process finished with exit code 0 ``` 针对以上代码没有难于理解的,其中为了打印数组方便,调用了数组的toList方法。 ### **获取元素:下标获取,get、elementAt、first、last、getOrNull** 数组获取指定位置元素可以用**下标获取、get方法获取、elementAt方法获取**。如果是特殊位置的获取,比如第一个位置,最后一个位置,我们可以直接使用提供好的**first、last方法**。为了安全起见,还可以使用getOrNull去获取元素,防止出现数组越界。 get方法、elementAt方法、first方法、last方法的方法签名如下: **get源码——[Array.kt](https://www.w3cschool.cn/doc_kotlin/kotlin-api-latest-jvm-stdlib-kotlin--array-index.html?lang=en)** ``` package kotlin public class Array<T> { public inline constructor(size: Int, init: (Int) -> T) public operator fun get(index: Int): T public operator fun set(index: Int, value: T): Unit public val size: Int public operator fun iterator(): Iterator<T> } ``` 其他方法出处自——**_Arrays.kt**,[Package kotlin.collections](https://www.w3cschool.cn/doc_kotlin/kotlin-api-latest-jvm-stdlib-kotlin-collections-index.html?lang=en) >[info] 注意:这里的`_Arrays.kt`和篇章末尾的**Arrays.kt**,不是同一个文件,它们在不同的包中 ``` @file:kotlin.jvm.JvmMultifileClass @file:kotlin.jvm.JvmName("ArraysKt") package kotlin.collections import kotlin.random.* .............. @kotlin.internal.InlineOnly public inline fun <T> Array<out T>.elementAt(index: Int): T { return get(index) } .............. public fun <T> Array<out T>.first(): T { if (isEmpty()) throw NoSuchElementException("Array is empty.") return this[0] } ............... public fun <T> Array<out T>.last(): T { if (isEmpty()) throw NoSuchElementException("Array is empty.") return this[lastIndex] } ............... public fun <T> Array<out T>.getOrNull(index: Int): T? { return if (index >= 0 && index <= lastIndex) get(index) else null } ............... ``` 稍微解释下: * get:获取指定位置元素; * elementAt:获取指定位置元素; * first:获取第一个位置元素; * last:获取最后一个位置元素; * getOrNull:获取指定位置元素,如果没有获取成功则返回null,免去了数组越界的麻烦,关于数组越界,后面一点也会专门给大家强调。 同样,我们编写一个案例去验证下,参考代码: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3) println("----------元素的获取----------") println("通过[1]获取,第2个元素:${intArr[1]}") println("通过get方法获取,第2个元素:${intArr.get(1)}") println("通过getOrNull方法获取,第2个元素:${intArr.getOrNull(1)}") println("通过getOrNul方法获取,第4个元素:${intArr.getOrNull(3)}") println("通过elementAt方法获取,第2个元素:${intArr.elementAt(1)}") println("----------特殊位置的元素获取------------") println("通过first获取,第一个元素:${intArr.first()}") println("通过last获取,最后一个元素:${intArr.last()}") } ~~~ 运行结果 ``` ----------元素的获取---------- 通过[1]获取,第2个元素:2 通过get方法获取,第2个元素:2 通过getOrNull方法获取,第2个元素:2 通过getOrNul方法获取,第4个元素:null 通过elementAt方法获取,第2个元素:2 ----------特殊位置的元素获取------------ 通过first获取,第一个元素:1 通过last获取,最后一个元素:3 Process finished with exit code 0 ``` ### **是否包含元素:contains方法** contains方法用于判断集合中是否存包含某个元素,方法接收参数为元素,返回值Boolean类型,方法定义如下: 同样出自——_Arrays.kt,[Package kotlin.collections](https://www.w3cschool.cn/doc_kotlin/kotlin-api-latest-jvm-stdlib-kotlin-collections-index.html?lang=en) ~~~ public operator fun <@kotlin.internal.OnlyInputTypes T> Array<out T>.contains(element: T): Boolean { return indexOf(element) >= 0 } ~~~ 下面例子,判断集合中是否存在某个元素: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3) println("----------元素的判断是否包含------------") println("intArr是否包含元素1:${intArr.contains(1)}") println("intArr是否包含元素4:${intArr.contains(4)}") } ~~~ 运行结果 ``` ----------元素的判断是否包含------------ intArr是否包含元素1:true intArr是否包含元素4:false Process finished with exit code 0 ``` ### **获取元素索引:indexOf方法** indexOf()获取元素对应的位置,如果数组中不存在该元素返回-1,参考代码: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3) println("----------元素索引的获取------------") println("获取元素1的索引:${intArr.indexOf(1)}") println("获取元素4的索引:${intArr.indexOf(4)}") } ~~~ 运行结果 ``` ----------元素索引的获取------------ 获取元素1的索引:0 获取元素4的索引:-1 Process finished with exit code 0 ``` 在定义数组时,数组中的元素可以是相同的,如果想查找数组中的一个元素的角标,首先需要指定查找的这个元素,进而判断查找的是元素中的第1个元素的角标还是最后一个元素的角标,接下来我们通过案例来学习如何查找元素对应的角标。 (1)查找数组中指定元素的第1个角标 查找数组中指定元素中的第1个元素的角标,具体代码如下所示 ``` fun main(args: Array<String>) { var newArr: IntArray = intArrayOf(6, 4, 3, 4, 9) //定义一个数组newArr并初始化该数组 println("第一个元素4的角标为" + newArr.indexOf(4)) //打印第一个元素4的角标 } ``` 运行结果 ``` 第一个元素4的角标为1 ``` 在上述代码中,首先定义了一个IntArray类型的数组newArr,同时初始化该数组。在该数组中可以看到有两个元素4,接下来查找这两个元素4中第1个元素4的角标,在第4行中通过数组的indexOf()方法来查找,该方法中传递的参数4就是需要查找的元素。 除了调用数组的indexOf()方法来查找指定元素中第1个元素的角标之外,还可以通过数组的indexOfFirst()方法来查找指定元素中第1个元素的角标。稍微修改一下上述代码后的具体代码如下所示 ``` fun main(args: Array<String>) { var newArr: IntArray = intArrayOf(6, 4, 3, 4, 9) //定义一个数组newArr并初始化该数组 var index = newArr.indexOfFirst { //查找数组中第一个元素4对应的角标 it == 4 //将需要查找的元素赋值给it } println("第一个元素4的角标为" + index) //打印第一个元素4的角标 } ``` 运行结果 ``` 第一个元素4的角标为1 ``` 在上述代码中,第3~5行是通过调用数组的indexOfFirst()方法来查找数组中第1个元素4对应的角标,其中第4行中的it表示需要查找的元素,因此将需要查找的元素4赋值给it。最后打印数组中查找的第1个元素4的角标。 (2)查找数组中指定元素的最后一个角标 查找数组中指定元素中的最后一个元素的角标,具体代码如下所示。 ``` fun main(args: Array<String>) { var newArr: IntArray = intArrayOf(6, 4, 3, 4, 9) //定义一个数组newArr并初始化该数组 println("最后一个元素4的角标为" + newArr.lastIndexOf(4)) //打印最后一个元素4的角标 } ``` 运行结果 ``` 最后一个元素4的角标为3 ``` 除了调用数组的lastIndexOf()方法来查找指定元素的角标之外,还可以通过数组的indexOfLast()方法来查找指定元素的最后一个角标。 ``` fun main(args: Array<String>) { var newArr: IntArray = intArrayOf(6, 4, 3, 4, 9) //定义一个数组newArr并初始化该数组 var index = newArr.indexOfLast { //查找数组中最后一个元素4对应的角标 it == 4 //将需要查找的元素赋值给it } println("最后一个元素4的角标为" + index) //打印最后一个元素4的角标 } ``` 运行结果 ``` 最后一个元素4的角标为3 ``` ### **获取数组长度:size属性、count方法** 获取长度可以通过size属性和count方法去获取,参考代码: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3) println("----------获取数组的长度------------") println("数组intArr的长度:${intArr.size}") println("数组intArr的长度:${intArr.count()}") println("----------反转元素-----------------") intArr.reverse() println("反转后的数组:${intArr.toList()}") } ~~~ 运行结果 ``` ----------获取数组的长度------------ 数组intArr的长度:3 数组intArr的长度:3 ----------反转元素----------------- 反转后的数组:[3, 2, 1] Process finished with exit code 0 ``` ### **反转元素:reverse方法** reverse()方法对数组元素反转,第1个元素变成最后一个,最后一个元素变成第1一个元素。反转后,原来数组元素位置都倒转过来,参考代码: 参考上面的代码 下面是Arrays.kt的源码 ``` package kotlin public class ByteArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Byte) public operator fun get(index: Int): Byte public operator fun set(index: Int, value: Byte): Unit public val size: Int public operator fun iterator(): ByteIterator } public class CharArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Char) public operator fun get(index: Int): Char public operator fun set(index: Int, value: Char): Unit public val size: Int public operator fun iterator(): CharIterator } public class ShortArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Short) public operator fun get(index: Int): Short public operator fun set(index: Int, value: Short): Unit public val size: Int public operator fun iterator(): ShortIterator } public class IntArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Int) public operator fun get(index: Int): Int public operator fun set(index: Int, value: Int): Unit public val size: Int public operator fun iterator(): IntIterator } public class LongArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Long) public operator fun get(index: Int): Long public operator fun set(index: Int, value: Long): Unit public val size: Int public operator fun iterator(): LongIterator } public class FloatArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Float) public operator fun get(index: Int): Float public operator fun set(index: Int, value: Float): Unit public val size: Int public operator fun iterator(): FloatIterator } public class DoubleArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Double) public operator fun get(index: Int): Double public operator fun set(index: Int, value: Double): Unit public val size: Int public operator fun iterator(): DoubleIterator } public class BooleanArray(size: Int) { public inline constructor(size: Int, init: (Int) -> Boolean) public operator fun get(index: Int): Boolean public operator fun set(index: Int, value: Boolean): Unit public val size: Int public operator fun iterator(): BooleanIterator } ```