1.3中缺少Kotlin的ArrayList.removeRange选项吗?

时间:2019-07-05 12:01:44

标签: android arraylist kotlin kotlin-android-extensions

与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版中已删除

2 个答案:

答案 0 :(得分:0)

removeRange受Kotlin保护,但这可以解决问题:

array.subList(2, 4).clear();

答案 1 :(得分:0)

没有干净的方法可以做到这一点。 Shermano是正确的。不好,但这是最好的方法。您的选择

a)使用dropLastdrop

但是,您不能对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