Опция ArrayList.removeRange для Kotlin отсутствует в 1.3? - PullRequest
0 голосов
/ 05 июля 2019

Есть ли в Kotlin какая-либо функция для удаления определенного диапазона элементов, как в Java.

В 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 был добавлен в 1.1 Kotlin, но был удален в 1.3

Ответы [ 2 ]

0 голосов
/ 16 июля 2019

Нет чистого способа сделать это. Шермано прав.Это не приятно, но это лучший способ.Ваши варианты

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
0 голосов
/ 05 июля 2019

removeRange защищен в котлине, но это должно сработать:

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