Почему функции расширения не работают с ArrayList - PullRequest
0 голосов
/ 29 октября 2019

Я очень новичок в разработке для Android в Котлине. У меня есть ArrayList, состоящий из двух ArrayLists типа Double. Я хочу отбросить / разрезать все после первого элемента в большом массиве ArrayList. При обнаружении свойств, описанных здесь на странице Kotlin, я обнаружил некоторые функции, такие как dropLast, take и т. Д. Однако они не выполняются при реализации, также нет ошибки. Я все еще получаю тот же вывод, что и ввод, имеющий ту же длину. Хотя такие функции, как add, get в столбце Functions работают нормально. Я, безусловно, что-то здесь упускаю. Каким был бы способ добиться этого?

Ниже приведен фиктивный код: -

fun padding(tokenizedinput : ArrayList<ArrayList<Double>>) : ArrayList<ArrayList<Double>> {
    var temp_storage = tokenizedinput // of size 2
    temp_storage.take(1) // OPTION 1. Only want to have first element in this ArrayList
    temp_storage.dropLast(1) // OPTION 2. Only want to drop 1 element from the end
    println("FInal size: "+ temp_storage.size) //still size 2. Why not 1!?
    return temp_storage
}

Ответы [ 3 ]

3 голосов
/ 29 октября 2019
temp_storage.take(1)

Возвращает исправленный List. Он не изменяет List, на котором вы его называете. Вы игнорируете возвращенное значение.

temp_storage.dropLast(1)

То же самое - вы игнорируете работу, которую выполняет функция.

println("FInal size: "+ temp_storage.size) //still size 2. Why not 1!?

Это тот же размер, потому что вы ничего не изменили,

Как это можно сделать?

Если я понимаю, что вы хотите, используйте:

fun padding(tokenizedinput : ArrayList<ArrayList<Double>>) = arrayListOf(tokenizedinput[0])

Здесь мы:

  • Получить первый элемент tokenizedinput

  • Обернуть это в ArrayList, так как вы хотели получить ArrayList<ArrayList<Double>> ответ

2 голосов
/ 29 октября 2019

List.take(n) или List.dropLast(n) будет return новый список с операцией. Это НЕ ИЗМЕНИТ существующий список. Попробуйте войти в систему или распечатать его следующим образом: -

println(temp_storage.take(1).size) // would be 1
println(temp_storage.dropLast(1).size) // would be 1

Приведенные выше результаты будут 1, если размер списка равен 2

Для преобразованияк существующему списку используйте: -

temp_storage = ArrayList(temp_storage.dropLast(1)) // need to cast it to ArrayList<T> before assigning
1 голос
/ 29 октября 2019

Чтобы добавить к тому, что уже сказали другие ответы, из фактического класса, который содержит этот метод:

Метод take :

/**
 * Returns a list containing first [n] elements.
 * 
 * @throws IllegalArgumentException if [n] is negative.
 * 
 * @sample samples.collections.Collections.Transformations.take
 */
public fun <T> Iterable<T>.take(n: Int): List<T> {
    require(n >= 0) { "Requested element count $n is less than zero." }
    if (n == 0) return emptyList()
    if (this is Collection<T>) {
        if (n >= size) return toList()
        if (n == 1) return listOf(first())
    }
    var count = 0
    val list = ArrayList<T>(n)
    for (item in this) {
        if (count++ == n)
            break
        list.add(item)
    }
    return list.optimizeReadOnlyList()
} 

, а также dropLast :

/**
 * Returns a list containing all elements except last [n] elements.
 * 
 * @throws IllegalArgumentException if [n] is negative.
 * 
 * @sample samples.collections.Collections.Transformations.drop
 */
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))
}

, который можно найти в _Collections.kt

Это означает, что он возвращает список, он не изменяет исходную коллекцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...