如何在Kotlin中复制MutableList?

时间:2018-01-27 15:50:48

标签: list kotlin mutable

所以,我刚开始与Kotlin一起试图解决骑士到达棋盘上目的地的最小步骤"问题。 这是我的代码:

fun knightSteps(i:Int,j:Int,a:Int,b:Int,board:Int,c :Int,d:Int,visited : MutableList<Pair<Int,Int>>,steps:Int):Int{
    // (i,j) start (a,b)knight moves (c,d) destination visited - visited positions board - size of board
    if(i==c && j==d) return steps
    if(isValid(Pair(i,j),board)){
        val v = visited
        v.add(Pair(i,j))

        var possible = mutableListOf<Int>()
        if(Pair(i+a,j+b) !in v ) {
            possible.add(knightSteps(i + a, j + b, a, b, board,c,d, v, 1 + steps))
        }
        if(Pair(i+a,j-b) !in v ) {
            if(i==1&&j==3) println("YES!!")
            possible.add(knightSteps(i + a, j - b, a, b, board,c,d, v, 1 + steps))
        }
        .
        .  // rest of other 8 possible moves
        .
        possible.removeAll{it==-1}
        if(possible.size==0){
            return -1
        }
        //println(possible)
        return possible.min()!!
    }
    return -1
}

但是一旦它通过第一个&#39;如果&#39;条件&#39;访问&#39;和&#39; v&#39;可变列表正在改变它们的值,结果是println("YES!!")在第二个&#39;如果&#39;永远不会被执行。

所以函数正在改变它们..如果我改变val v = visited.toMutableList(,它会进入无限循环!有人可以帮忙。

2 个答案:

答案 0 :(得分:1)

是的,在java和kotlin中,几乎所有内容都作为参考传递。但是在kotlin中你有编译时验证的能力使任何MutableList不可变 - 只需将方法参数类型从MutableList更改为List

答案 1 :(得分:1)

当您向visited添加值时,它们将被添加到函数的参数中(即在函数外部也可见)。此外,vvisited指向同一对象。使用哪个变量来添加元素并不重要,之后列表将包含一个新元素。声明val v = visited 不会创建任何副本。 要复制列表,您可以执行visited.toList(),其内容基本上映射到ArrayList(visited)的调用。