创建具有新大小的通用数组的副本

时间:2018-12-04 19:32:20

标签: arrays generics kotlin

如果我已经有了该数组的实例并为它的项目传递构造方法,那么在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 :(得分:2)

为此,我只想向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() })}")

答案 1 :(得分:0)

我想这会起作用:

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数组中。