企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### **追加复制集合:plusElement** [TOC] 出处 ~~~ //Returns an array containing all elements of the original array and then the given element. //返回一个数组, 其中包含原始数组的所有元素, 和给定的元素。 fun <T> Array<T>.plusElement(element: T): Array<T> ~~~  一个数组的长度是固定的,我们没法会其添加元素,但是,kotlin提供了一个方法plusElement,可以对原集合添加元素之后,变成一个新的集合,这样的操作在java里面是没有的,参考代码: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3) //追加元素4 val newArr = intArr.plusElement(4) println("新的数组:${newArr.toList()}") } ~~~ 运行结果 ``` 新的数组:[1, 2, 3, 4] Process finished with exit code 0 ``` 查看plusElement的源码发现它也是复制了一个集合 ~~~ @kotlin.internal.InlineOnly public actual inline fun <T> Array<T>.plusElement(element: T): Array<T> { return plus(element) } ~~~ ~~~ public actual operator fun <T> Array<T>.plus(element: T): Array<T> { val index = size val result = java.util.Arrays.copyOf(this, index + 1) result[index] = element return result } ~~~ ### **删除复制集合:drop和dropLast** **一个数组的长度是固定的,我们没法删除其元素**,但是,kotlin提供了2个方法**drop和dropLast**。 * drop方法:接收一个Int类型参数,表示可以**指定从数组开始位置移除原数组的几个元素**。 * dropLast,方法接收一个Int类型参数,表示可以指定从数组末尾位置移除原数组的几个元素。 这样的操作在java里面是没有的,参考代码: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3, 4, 5) // intArr[-1] println("-----------原数组-----------") println("原数组是:${intArr.toList()}") //追加元素6 val newArr = intArr.plusElement(6) println("新的数组newArr:${newArr.toList()}") //删除复制数组 println("---------从头开始删除2个元素-------------") val newArr2 = intArr.drop(2) println("新的数组newArr2:${newArr2.toList()}") println("---------从头开始删除2个元素-------------") val newArr3 = intArr.dropLast(2) println("新的数组newArr3:${newArr3.toList()}") //分割数组 println("-----------分割数组-----------") //取数组索引[0-3]对应的元素 val sliceArray1 = intArr.sliceArray(0..3) println("新的数组sliceArray1:${sliceArray1.toList()}") //取数组索引[2-4]对应的元素 val sliceArray2 = intArr.sliceArray(2..4) println("新的数组sliceArray2:${sliceArray2.toList()}") } ~~~ 运行结果 ``` -----------原数组----------- 原数组是:[1, 2, 3, 4, 5] 新的数组newArr:[1, 2, 3, 4, 5, 6] ---------从头开始删除2个元素------------- 新的数组newArr2:[3, 4, 5] ---------从头开始删除2个元素------------- 新的数组newArr3:[1, 2, 3] -----------分割数组----------- 新的数组sliceArray1:[1, 2, 3, 4] 新的数组sliceArray2:[3, 4, 5] Process finished with exit code 0 ``` 针对以上代码同样drop和dropLast内部肯定也是通过复制集合实现的,这里源码如下了。 ~~~ //Returns a list containing all elements except first [n] elements. //返回包含除前 n 个元素以外的所有元素的列表。 public fun <T> Array<out T>.drop(n: Int): List<T> { require(n >= 0) { "Requested element count $n is less than zero." } return takeLast((size - n).coerceAtLeast(0)) } ~~~ ~~~ //Returns a list containing all elements except last [n] elements. //返回包含除最后n个元素之外的所有元素的列表。 public fun <T> Array<out T>.dropLast(n: Int): List<T> { require(n >= 0) { "Requested element count $n is less than zero." } return take((size - n).coerceAtLeast(0)) } ~~~ ### **分割:slice方法** slice英语单词是“切分”的意思,sliceArray ()方法位表示可以对原数组进行切分,返回一个新的数组。参数接收一个区间, sliceArray方法源码如下: ~~~ //Returns a list containing elements at indices in the specified indices range. // 返回包含指定索引范围内索引处的元素的列表。 public fun <T> Array<T>.sliceArray(indices: IntRange): Array<T> { if (indices.isEmpty()) return copyOfRange(0, 0) return copyOfRange(indices.start, indices.endInclusive + 1) } ~~~ 我们编写一个案例看一下,参考代码: 正如上面的代码中所示,这里只截取分割部分的代码 ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3, 4, 5) //分割数组 println("-----------分割数组-----------") //取数组索引[0-3]对应的元素 val sliceArray1 = intArr.sliceArray(0..3) println("新的数组sliceArray1:${sliceArray1.toList()}") //取数组索引[2-4]对应的元素 val sliceArray2 = intArr.sliceArray(2..4) println("新的数组sliceArray2:${sliceArray2.toList()}") } ~~~ ### **数组下标越界** 数组下标越界,可以说是数组操作的一个经典问题。 是什么数组下标越界呢?我们在用数组下标去获取元素的时候,如果给定的下标大于了集合长度或者下标为负数,则会出现下标越界异常,程序会抛ArrayIndexOutOfBoundsException异常, 我们先把下标给成负数,参考案例: ~~~ fun main(args: Array<String>) { val intArr = arrayOf(1, 2, 3) intArr[-1] } ~~~ 运行结果 ``` Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at day02.ArrayDemo7Kt.main(ArrayDemo7.kt:12) Process finished with exit code 1 ```