ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ### list集合变化操作 可以通过slice、subList、drop、dropLast对集合进行变换,产生一个新的集合。 slice()方法,对集合进行截取,产生一个新的集合,接收一个区间类型的参数,方法签名如下: ~~~ public fun <T> List<T>.slice(indices: IntRange): List<T> { if (indices.isEmpty()) return listOf() return this.subList(indices.start, indices.endInclusive + 1).toList() } ~~~ subList ()方法,对集合进行截取,产生一个新的集合,方法接收截取的开始位置和结束位置,方法签名如下: ~~~ override fun subList(fromIndex: Int, toIndex: Int): MutableList<E> ~~~ drop ()方法,对集合进行丢弃,产生一个新的集合,从集合开始位置进行丢弃,方法接收丢弃元素的个数,方法签名如下: ~~~ public fun <T> Iterable<T>.drop(n: Int): List<T> { ............................ } ~~~ dropLast ()方法,对集合进行丢弃,产生一个新的集合,从集合结束位置进行丢弃,方法接收丢弃元素的个数,方法签名如下: ~~~ public fun <T> List<T>.dropLast(n: Int): List<T> { require(n >= 0) { "Requested element count $n is less than zero." } return take((size - n).coerceAtLeast(0)) } ~~~ 我们通过一个案例,来看看集合的变化操作,参考代码: ~~~ fun main(args: Array<String>) { val list = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9) //截取[0,2] var newList: List<Int>? = null newList = list.slice(0..2) println("slice(0..2):$newList") //截取[0,2) newList = list.slice(0 until 2) println("slice(0 until 2):$newList") //截取[0,2) newList = list.subList(0, 2) println("subList(0,2):$newList") //正向删除3个元素 newList = list.drop(3) println("正向删除3个元素drop(3):$newList") //反向删除3个元素 newList = list.dropLast(3) println("反向删除3个元素dropLast(3):$newList") } ~~~ 运行结果 ``` slice(0..2):[1, 2, 3] slice(0 until 2):[1, 2] subList(0,2):[1, 2] 正向删除3个元素drop(3):[4, 5, 6, 7, 8, 9] 反向删除3个元素dropLast(3):[1, 2, 3, 4, 5, 6] Process finished with exit code 0 ``` ### list集合下标越界问题 list集合下标越界,可以说是list集合操作的一个经典问题。是什么list集合下标越界呢?我们在用list集合下标去获取元素的时候,如果给定的下标大于了list集合长度或者下标为负数,则会出现下标越界异常,程序会抛出ArrayIndexOutOfBoundsException异常, 我们先把下标给成负数,参考案例: ![](http://upload-images.jianshu.io/upload_images/7368752-968f1b4045bcbe7b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 我们再把下标超出list集合长度,参考案例: ![](http://upload-images.jianshu.io/upload_images/7368752-1f584dde77160bc1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)