Kotlin 在它之后初始化数组';它是在科特林创建的?

Kotlin 在它之后初始化数组';它是在科特林创建的?,kotlin,Kotlin,我有一个Building类,它表示Room对象的数组。每个房间都有一些暂时不相关的属性 我从用户输入中获取房间,如下所示: 第一行是房间的数量 接下来的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] 应该创建对象的对象: Buil

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

我从用户输入中获取房间,如下所示:

  • 第一行是房间的数量
  • 接下来的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=新的扫描仪(System.in);
    房间[]房间=新房间[in.nextInt()];
    对于(int i=0;i
    然而,在kotlin中,这种方法有一个小问题:我必须在创建
    rooms
    数组时初始化它。我不能像在Java中那样创建一个未初始化的数组,然后在循环中初始化它。kotlin中的
    Array
    构造函数采用大小和lambda参数,以索引的顺序初始化数组。正如我所说,我不能保证输入将按索引的顺序给出。我只能保证所有房间都会被分配和初始化

    我可以创建一个空房间数组(
    array
    ),但我不喜欢这个想法,因为所有房间都会被给定,所以空检查和断言在以后使用该数组时将是无用的

    有没有办法在kotlin中创建一个未初始化的数组,并告诉编译器不要为此而惊慌失措,因为我保证在循环运行后数组将被完全初始化

    我没有找到一种方法,在不创建数组副本的情况下,将
    数组
    强制转换为
    数组
    ,这对我来说似乎是浪费。我也不认为我可以像使用常规非集合属性那样使用
    Array
    。我提出的唯一解决方案是使用虚拟
    Room
    对象初始化数组,然后在循环中实际初始化它:

    val dummy=Room(…)//具有无用属性的虚拟对象
    val房间=数组(大小){dummy}
    //循环中的实初始化
    重复(房间大小){
    val properties=readline()!!.split(“”)
    val roomIndex=properties[0].toInt()
    //解析其余的属性
    房间[roomIndex]=房间(…)
    }
    
    创建这样一个数组的最佳方法是什么?我认为我不应该使用
    Array
    ,因为我可以保证数组中的每个元素在循环后都是非空的,我不喜欢虚拟对象的想法,但这可能是最好的选择?你还有别的建议吗

    提前谢谢

    我没有找到在不创建数组副本的情况下将数组强制转换为数组的方法

    强制转换不会创建阵列(或任何其他对象)的副本。它只是创建了不同类型但引用相同的新变量(请参见)

    此外,还可以创建一个辅助函数,用于包装可空数组的创建和强制转换:

    @Suppress(“未选中的\u CAST”)
    inline fun buildArray(大小:Int,builderAction:Array.(->单位):数组=
    arrayOfNulls(大小)。也可以(builderAction)作为数组
    
    用法:

    val rooms=buildArray(大小){
    val properties=readLine()!!.split(“”)
    val roomIndex=properties[0].toInt()
    集合(房间索引,房间(…)
    }
    
    使用列表,而不是数组。清单是Kotlin的收藏。好吧,现在我觉得自己很笨。我不知道您可以使用
    as
    操作符将
    数组
    强制转换为
    数组
    。我在考虑
    filterNotNull
    方法,它确实创建了数组的副本