当前位置: 首页 > 知识库问答 >
问题:

Kotlin函数参数:无法重新分配Val

葛永丰
2023-03-14
class Node(key: Int) {...}

class BinarySearchTree {
    var root: Node? = null

    fun insert(newNode: Node) {...}

    fun RotateLeft(x: Node?) {...}

    fun RotateRight(x: Node?) {...}

    fun insertFixup(z: Node?) {
        var y: Node?
        while (z?.parent?.color == "RED") {
            if (z?.parent == z?.parent?.parent?.left) {
                y = z?.parent?.parent?.right
                if (y?.color == "RED") {
                    z?.parent?.color = "BLACK"
                    y?.color = "BLACK"
                    z?.parent?.parent?.color = "RED"
                    z = z?.parent?.parent
                }
                if (z == z?.parent?.right) {
                    z = z?.parent
                    RotateLeft(z)
                    z?.parent?.color = "BLACK"
                    z?.parent?.parent?.color = "RED"
                    RotateRight(z?.parent?.parent)
                }
            } else {
                y = z?.parent?.parent?.left
                if (y?.color == "RED") {
                    z?.parent?.color = "BLACK"
                    y?.color = "BLACK"
                    z?.parent?.parent?.color = "RED"
                    z = z?.parent?.parent
                }
                if (z != z?.parent?.left) {
                    z = z?.parent
                    RotateLeft(z)
                    z?.parent?.color = "BLACK"
                    z?.parent?.parent?.color = "RED"
                    RotateRight(z?.parent?.parent)
                }
            }
        }
        root?.color = "BLACK"
    }
}

fun main(args: Array<String>) {
    val bst = BinarySearchTree()

    while (true) {
        var newNode = Node(readLine()!!.toInt())
        bst.insert(newNode)
        bst.insertFixup(newNode)
    }
}

共有1个答案

柳英资
2023-03-14

Kotlin中的函数参数基本上是函数内部的只读val的,因此这里的z将始终引用传入的原始对象。

如果您需要在函数运行时修改它所指向的内容,您必须在函数开始时创建它的本地副本,然后您可以将其设置为var

例如,您可以像下面这样启动函数,它允许您稍后重新分配这个本地var:

fun insertFixup(_z: Node?) {
    var z = _z
    // ...
    z = z.parent
    // ...
}
 类似资料:
  • 我试图在kotlin中编写一个函数,但我无法将值重新分配给函数参数,它说val不能重新分配。 当我试图分配一个值url=主页. it给我错误val不能重新分配,我是新的kotlin,我不明白是什么问题,很少帮助将不胜感激。

  • 我为数据类创建了一个var扩展属性,如下所示: 但是,当我尝试将“Val”重新分配给此行中的新值时,编译器会抱怨“Val无法重新分配”: 我真的不明白为什么会这样??我有一个“var”位图属性而不是“val”,那么问题是什么?更重要的是,什么是解决方案或替代方案?

  • 我有这两个函数,我试图修改元素。其中一个编译,另一个说“val不能重新分配”。以下函数有什么区别?为什么一个编译,另一个不编译? 编译的那个 那个说 无法重新分配Val

  • 问题内容: 我有一个名为parseDate的函数,但是当我在我的php页面(它是一个joomla组件页面)上调用它时,出现致命错误:无法重新声明parsedate()(先前在template / ja_zeolite / assets / functions.php:2中声明)第21行的templates / ja_zeolite / assets / functions.php 第2行是函数pa

  • 我是Kotlin的新手,很难理解下面的代码 所以这个函数叫做,它的输入参数是一个名为的函数,它是

  • 我有一个问题,归结为试图将具有特定参数类型的函数分配给期望具有泛型类型的函数的变量: 游乐场版。 TypeScript给出以下错误: 类型“(v:string[]))= 这个错误对我来说没有多大意义,因为对于泛型,似乎是一个非常合理的类型。 有一个相关的问题具有相同的基本问题,但是答案是特定于该问题的情况的:为什么实现接口的TypeScript类不能分配给扩展接口的通用约束?