程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 Kotlin 中创建数组后对其进行初始化?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 Kotlin 中创建数组后对其进行初始化??

开发过程中遇到在 Kotlin 中创建数组后对其进行初始化?的问题如何解决?下面主要结合日常开发的经验,给出你关于在 Kotlin 中创建数组后对其进行初始化?的解决方法建议,希望对你解决在 Kotlin 中创建数组后对其进行初始化?有所启发或帮助;

我有一个 Building 类,它表示一个 Room 对象数组。每个房间都有一些暂时不相关的属性。

我从这样的用户输入中获取房间:

  1. 第一行是房间数。
  2. 接下来的 n 行以这种格式提供有关房间的信息:"[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 转换为 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,请注明来意。
标签: