我该如何修复这个特定的 "Val cannot be reassigned" 错误?

How can I fix this particular "Val cannot be reassigned" error?

我的这段代码一直给我一个“无法重新分配 Val”的错误,但我似乎无法将变量更改为 var 而不是 val。我只是希望能够为我的单元格引用设置一个字符串值,这样我以后就可以像这样访问这些值 myStringsArrayList.add(deviceData.cellOne).

这是我的代码:

val cells = listOf(
            deviceData.cellOne,
            deviceData.cellTwo,
            deviceData.cellThree,
            deviceData.cellFour,
            deviceData.cellFive,
            deviceData.cellSix,
            deviceData.cellSeven,
            deviceData.cellEight,
            deviceData.cellNine,
            deviceData.cellTen,
            deviceData.cellEleven,
            deviceData.cellTwelve,
            deviceData.cellThirteen,
            deviceData.cellFourteen
        )

        for ((i, cell) in cells.withIndex()) {
            val value = data[2 + i].toDouble() / 100 + 3.52
            val cellNumberString = (i + 1).toString()
            val formattedString = "Cell $cellNumberString: %.2fV".format(value)
            cell = formattedString // THIS IS WHERE THE PROBLEM IS (cell is a val)
        }

有谁知道我如何解决这个问题并实现我想要的功能?

我尝试使用 listIterator(),但它似乎没有按照我想要的方式工作。

这是我对 listIterator() 的尝试:

val cells = mutableListOf(
            deviceData.cellOne,
            deviceData.cellTwo,
            deviceData.cellThree,
            deviceData.cellFour,
            deviceData.cellFive,
            deviceData.cellSix,
            deviceData.cellSeven,
            deviceData.cellEight,
            deviceData.cellNine,
            deviceData.cellTen,
            deviceData.cellEleven,
            deviceData.cellTwelve,
            deviceData.cellThirteen,
            deviceData.cellFourteen)

        val iterate = cells.listIterator()
        while (iterate.hasNext()) {
            var cell = iterate.next()
            val value = data[2 + iterate.nextIndex()].toDouble() / 100 + 3.52
            val cellNumberString = (iterate.nextIndex() + 1).toString()
            val formattedString = "Cell $cellNumberString: %.2fV".format(value)
            cell = formattedString
        }

你不能把它变成 var,反正也没有理由!

for ((i, cell) in cells.withIndex()) {
    ...
    cell = formattedString // THIS IS WHERE THE PROBLEM IS (cell is a val)
}

您正在一个集合上创建一个 for 循环,带有一个索引,并为每个循环提供一个代码块 运行。因此,当循环 运行s 时,您将获得两个参数 - 集合中的当前项目及其在该集合中的索引。

这些只是在循环中使用的内部变量 - 您不能重新分配它们,因为它们是传入的值。即使可以,您也只是更改那些局部变量的值.

您可能想要做的是更新 cells 列表,获取循环中的当前项目,在 cells 中找到它并替换它。您必须实际更新 cells 才能做到这一点!更改列表本身。您可以使用 cells[i] = formattedString - 但是 因为您目前正在迭代 cells 集合,所以您不应该修改它!

您可以复制源列表,但典型的 Kotlin 方法是使用 map(转换值)创建一个新列表:

cells.mapIndexed { i, cell ->
    val value = data[2 + i].toDouble() / 100 + 3.52
    val cellNumberString = (i + 1).toString()
    // last expression is the return value, i.e. the formatted string
    "Cell $cellNumberString: %.2fV".format(value)
}

这将吐出一个新的(不可变的)列表,其中每个单元格都已 映射 到该格式化字符串版本。

您可以将 cells 设为 var 并重新分配它:

cells = cells.mapIndexed { ... }

或者在初始化 val 时链接映射调用,这样最终结果就是被分配的结果:

val cells = listOf(
    ...
).mapIndexed { ... }

但是您实际上并没有在那个循环中使用 cell,只是使用索引来生成值。 You can create a list like this:

val data = List(14) { i ->
    val value = data[2 + i].toDouble() / 100 + 3.52
    // you can calculate the index inside the string by using braces
    "Cell ${i + 1}: %.2fV".format(value)
}

这完全取决于您是否需要为任何东西保留 devicedata 值列表(如果需要,请使用它来创建 另一个 列表)

您可能想这样使用交互器:

val list = mutableListOf("One", "Two", "Three", "Four")
println(list.joinToString(" "))

val iterator = list.listIterator()
while(iterator.hasNext()) {
    val value = iterator.next()
    if (value == "Two") {
        iterator.set("xxxxxx")
    }
}
println(list.joinToString(" "))

使用'set'方法。