如何在 kotlin 中从数据 class 的构造函数初始化 'MutableMap'?

How to initialise 'MutableMap' from constructor of data class in kotlin?

我有一个 data class 有一个 constructor 像这样 ():

data class MyDataClass (
    val myArr: ArrayList<Char>
) {
    constructor(n: Int): 
        this(
            ArrayList((0 until n).map { ('A' + it).toChar() })
        )
}

举个例子:

println(MyDataClass(3).myArr)

会给我:

[A, B, C]

我想像这样进一步修改我的data class

data class MyDataClass (
    val myArr: ArrayList<Char>,
    val myMap: MutableMap<Char, MutableMap<String, String>>
) {
    constructor(n: Int): 
    this(
            ArrayList((0 until n).map { ('A' + it).toChar() }),
            mutableMapOf()
        )
}

现在,当我打印 myMap 时:

println(MyDataClass(3).myMap)

我得到:

{}

现在,我想要的不是 myMap 的空 MutableMap,而是像这样的 MutableMap

println(MyDataClass(3).myMap)
{A={}, B={}, C={}}

我该怎么做?

您可以执行以下操作之一:

  1. 将初始化逻辑提取到伴随函数中:
data class MyDataClass(
    val myArr: ArrayList<Char>,
    val myMap: MutableMap<Char, MutableMap<String, String>>
) {
    constructor(n: Int) : this(
        ArrayList(foo(n)),
        foo(n).map { it to mutableMapOf<String, String>() }.toMap().toMutableMap()
    )

    companion object {
        fun foo(n: Int) = (0 until n).map { ('A' + it) }
    }
}
  1. 添加中间构造函数
data class MyDataClass(
    val myArr: ArrayList<Char>,
    val myMap: MutableMap<Char, MutableMap<String, String>>
) {
    constructor(n: Int) : this(ArrayList((0 until n).map { ('A' + it) }))

    constructor(list: ArrayList<Char>) : this(
        list,
        list.map { it to mutableMapOf<String, String>() }.toMap().toMutableMap()
    )
}

我不确定我是否完全理解这种选择构造函数参数背后的原因,但我会说你只需要一个构造函数,因为一切都是从你接受的 int 参数构建的显式构造函数。从那里开始,我会将代码简化为如下所示:

data class Thingamajigg(val n: Int) {
    val myArr: ArrayList<Char> = arrayListOf()
    val myMap: MutableMap<Char, MutableMap<String, String>> = mutableMapOf()

    init {
        (0..n).forEach { myArr.add('A' + it) }
        myArr.forEach { myMap[it] = mutableMapOf() }
    }
}

符合您的需求吗?