Создать копию универсального массива с новым размером - PullRequest
0 голосов
/ 04 декабря 2018

Возможно ли в Kotlin создать копию универсального массива с новым размером, если у меня уже есть экземпляр этого массива и передан метод конструирования для его элементов?Я думаю о чем-то вроде этого:

fun <T> resize(arr: Array<T>, newSize: Int, creator: (Int) -> T): Array<T> {
    ...
}

Очевидно, я не могу вызвать Array<T>(newSize) { i -> creator(i) }, потому что тип T не известен во время компиляции.Из соображений эффективности я не хочу использовать встроенную функцию с ограниченным типом.Я также не могу использовать здесь метод arr.copyOf(newSize), потому что он возвращает Array<T?>.

. В Java я мог бы использовать Arrays.copyOf(arr, newSize) даже с универсальным массивом, потому что у нас нет нулевой безопасности здесь.Но сработает ли это и в Котлине?Или у тебя есть другие идеи, что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я бы просто добавил метод расширения к Array<T> для этого.Вы все еще можете положиться на Arrays.copyOf под капотом, но перед возвратом значения заполните все оставшиеся пробелы результатом блока creator:

fun <T> Array<T>.resize(newSize: Int, creator: (Int) -> T): Array<T> {
    val copiedArray = Arrays.copyOf(this, newSize)
    for (i in size until newSize) { copiedArray[i] = creator(i) }
    return copiedArray
}

Например:

val array = arrayOf("a", "b", "c")

// same: [a, b, c]
println("same: ${Arrays.toString(array.resize(3) { it.toString() })}")

// less: [a, b]
println("less: ${Arrays.toString(array.resize(2) { it.toString() })}")

// more: [a, b, c, 3, 4]
println("more: ${Arrays.toString(array.resize(5) { it.toString() })}")
0 голосов
/ 04 декабря 2018

Я думаю, это будет работать:

fun <T> resize(arr: Array<T>, dest: Array<T>, creator: (Int) -> T): Array<T> {
    val list = arrayListOf<T>()
    // fill the list
    for (i in 0 until dest.size) {
        list.add(creator(i))
    }
    return list.toArray(dest)
}

fun callResize() {
    val arr = Array(5) { " " }
    val dest = Array(10) { "" }
    val creator = { i: Int -> "$i"}
    resize(arr, dest, creator)
}

Результат находится в массиве dest.

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