如何在Kotlin中复制MutableList?

所以,我刚开始和Kotlin一起,试图解决“骑士到棋盘上的目的地”的问题。 这是我的代码:

fun knightSteps(i:Int,j:Int,a:Int,b:Int,board:Int,c :Int,d:Int,visited : MutableList<Pair>,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() 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,jb) !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 } 

但是一旦它通过了第一个“if”条件,“visited”和“v”可变列表就会改变它们的值,结果第二个“if”中的println("YES!!")永远不会被执行。

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

是的,在java和kotlin几乎所有的东西都作为参考传递。 但在kotlin你有编译时validation的能力,使任何MutableList不可变 – 只要将方法参数types从MutableListList

当你添加值来visited他们将被添加到你的函数的参数(即也是可见的function之外)。 另外, vvisited指向同一个对象 。 使用哪个variables添加元素并不重要,此后列表将包含一个新的元素。 val v = visited语句不会创建任何副本 。 对于复制一个列表,你可以做visited.toList() ,它基本上映射到一个ArrayList(visited)的调用。