如果我已经有了该数组的实例并为它的项目传递构造方法,那么在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)
,因为这里没有空安全性。但这在科特林也行吗?还是您还有其他想法我可以做什么?
答案 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
数组中。