大佬教程收集整理的这篇文章主要介绍了在 Kotlin 中创建数组后对其进行初始化?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 Building
类,它表示一个 Room
对象数组。每个房间都有一些暂时不相关的属性。
我从这样的用户输入中获取房间:
"[room index] [room propertIEs...]"
。每个房间的索引范围从 0 到 n -1。示例输入:
3
0 [room 0 propertIEs: a,b]
2 [room 2 propertIEs: x,y]
1 [room 1 propertIEs: u,v]
应该创建对象:
Building: rooms: [Room(a,b),Room(u,v),Room(x,y)]
我不能保证房间会按顺序提供,但我可以保证所有房间都会作为输入提供。 如果我使用 Java,我可以轻松地编写这样的代码:
ScAnner in = new ScAnner(system.in);
Room[] rooms = new Room[in.nexTint()];
for (int i = 0; i < rooms.length; i++) {
int roomIndex = in.nexTint();
// Get room propertIEs from rest of line input
rooms[roomIndex] = new Room(...);
}
但是,在kotlin中,这种方法有一个小问题:我在创建rooms
数组时必须对其进行初始化。我不能创建一个未初始化的数组,就像在 Java 中一样,然后在循环中初始化它。 kotlin 中的 Array
构造函数采用大小和 lambda 参数来初始化数组按索引顺序。正如我所说,我不能保证输入将按照索引的顺序给出。我只能保证所有房间都会给和初始化。
我可以创建一个可空房间数组 (Array<Room?>
),但我不喜欢这个想法,因为所有房间都会被给出,所以在以后使用该数组时空检查和断言将毫无用处。>
有没有办法在 kotlin 中创建一个未初始化的数组,并告诉编译器不要担心这个,因为我保证在循环运行后数组将被完全初始化?
我没有找到在不创建数组副本的情况下将 Array<Room?>
转换为 Array<Room>
的方法,这对我来说似乎很浪费。我也不认为我可以像使用常规的非集合属性那样使用 Array<lateinit Room>
之类的东西。我想出的唯一解决方案是用一个虚拟的 Room
对象初始化数组,然后在循环中实际初始化它:
val dummy = Room(...) // dummy object with uSELEss propertIEs
val rooms = Array(sizE) { dummy }
// Real initialization in a loop
repeat(rooms.sizE) {
val propertIEs = readline()!!.split(' ')
val roomIndex = propertIEs[0].toInt()
// Parse rest of propertIEs
rooms[roomIndex] = Room(...)
}
创建这样一个数组的最佳方法是什么?我不认为@R_755_10675@用 Array<Room?>
因为我可以保证数组的每个元素在循环后都将是非空的,而且我不喜欢虚拟对象的想法,但它可能是最好的赌注?你还有什么建议吗?
提前致谢。
我没有找到在不创建数组副本的情况下将 Array
CasTing 不会创建数组(或任何其他对象)的副本。它只是创建具有不同类型但具有相同引用的新变量(参见 proof)。
此外,您可以创建一个辅助函数,包装可空数组的创建和转换:
@Suppress("UNchecKED_CAST")
inline fun <reified T> buildArray(size: Int,builderAction: Array<T?>.() -> Unit): Array<T> =
arrayOfNulls<T>(sizE).also(builderAction) as Array<T>
用法:
val rooms = buildArray<Room>(sizE) {
val properties = readLine()!!.split(' ')
val roomIndex = properties[0].toInt()
set(roomIndex,Room(...))
}
以上是大佬教程为你收集整理的在 Kotlin 中创建数组后对其进行初始化?全部内容,希望文章能够帮你解决在 Kotlin 中创建数组后对其进行初始化?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。