与Java中一样,Kotlin中是否有任何功能可以删除特定范围的元素。
在Java中,我们有一个名为removeRange
的方法,该方法可以扩展并且可以变得有用。
expect class ArrayList<E> :MutableList<E>,RandomAccess{
constructor()
constructor(initialCapacity:Int)
constructor(elements:Collection<E>)
fun trimToSize()
fun ensureCapacity(minCapacity:Int)
// From List
override val size:Int
override fun isEmpty():Boolean
override fun contains(element:@UnsafeVariance E):Boolean
override fun containsAll(elements:Collection<@UnsafeVariance E>):Boolean
override operator fun get(index:Int):E
override fun indexOf(element:@UnsafeVariance E):Int
override fun lastIndexOf(element:@UnsafeVariance E):Int
// From MutableCollection
override fun iterator():MutableIterator<E>
// From MutableList
override fun add(element:E):Boolean
override fun remove(element:E):Boolean
override fun addAll(elements:Collection<E>):Boolean
override fun addAll(index:Int,elements:Collection<E>):Boolean
override fun removeAll(elements:Collection<E>):Boolean
override fun retainAll(elements:Collection<E>):Boolean
override fun clear()
override operator fun set(index:Int,element:E):E
override fun add(index:Int,element:E)
override fun removeAt(index:Int):E
override fun listIterator():MutableListIterator<E>
override fun listIterator(index:Int):MutableListIterator<E>
override fun subList(fromIndex:Int,toIndex:Int):MutableList<E>
}
removeRange已在Kotlin的1.1版中添加,但在1.3版中已删除
答案 0 :(得分:0)
removeRange
受Kotlin保护,但这可以解决问题:
array.subList(2, 4).clear();
答案 1 :(得分:0)
没有干净的方法可以做到这一点。 Shermano是正确的。不好,但这是最好的方法。您的选择
a)使用dropLast
或drop
但是,您不能对ArrayList使用类型转换
lis = lis.dropLast(1) as ArrayList<Int>
它给出了运行时错误。必须像MutableList
这样声明变量,这几乎是相同的。
var lis = mutableListOf(2,3,4)
lis = lis.dropLast(2) as MutableList<Int>
println("dropLast: ${lis.size} ${lis[0]}")
它打印
dropLast: 1 2
您也可以使用lis.dropLast(2).toMutableList()
b)使用for
语句
var lis=arrayListOf(2,3,4)
for (i in lis.indices.reversed()) {
if (i>=1 && i<=2) lis.removeAt(i)
}
println("for: ${lis.size} ${lis[0]}")
请注意,您需要向后删除。
它打印
for: 1 2
c)使用subList
var lis = arrayListOf(2,3,4)
lis.subList(1,3).clear()
println("subList: ${lis.size} ${lis[0]}")
它打印
subList: 1 2
/ * /
我更喜欢封装在某些内联函数中的第三个选项。
inline fun <T> ArrayList<T>.delLen(ini:Int, len:Int=-1) {
if (len == -1)
this.subList(ini,this.size).clear()
else
this.subList(ini,ini+len).clear()
}
所以
lis.delLen(0,2) // delete the 0th postion for 2 positions.
lis.dellen(1) // delete from 1st postion forward.
我也喜欢
inline fun <T> ArrayList<T>.delLast(n:Int=1) {
this.subList(this.size-n,this.size).clear()
}
示例
lis.delLast() // delete the last position
list.delLast(3) // delete last 3 positions