如何在Kotlin中洗牌MutableList且不修改原列表?
解决Kotlin中shuffle()修改原列表的问题
这个问题其实是Kotlin里引用类型的常见小坑~你之前的代码里var shuffAlp = alphabets并没有创建新的列表,只是让shuffAlp和alphabets指向了内存里的同一个MutableList对象,所以调用shuffAlp.shuffle()的时候,本质上是在修改那个唯一的列表,原列表自然也跟着变了。
不用重复创建两次相同的初始列表,有这几种更优雅的方法:
方法1:复制原列表再洗牌
用toMutableList()给原列表创建一个副本,这样新变量指向的是全新的列表实例,操作它不会影响原列表:
fun main(){ val alphabets = ('A'..'Z').toMutableList() val shuffAlp = alphabets.toMutableList() // 复制原列表生成新实例 shuffAlp.shuffle() println(alphabets) // 输出原有序列表 println(shuffAlp) // 输出洗牌后的列表 }
方法2:用展开运算符创建新列表
如果你习惯用mutableListOf(),可以配合展开运算符快速生成副本:
val shuffAlp = mutableListOf(*alphabets.toTypedArray()) shuffAlp.shuffle()
方法3:用shuffled()直接获取洗牌后的新列表
如果不需要新列表是Mutable类型,直接用shuffled()函数更简洁——它会返回一个洗牌后的新List,完全不会修改原列表:
fun main(){ val alphabets = ('A'..'Z').toMutableList() val shuffAlp = alphabets.shuffled() // 返回新的洗牌列表,原列表不变 println(alphabets) println(shuffAlp) }
核心思路就是:不要直接赋值引用,而是创建原列表的副本,这样就能同时保留原列表和洗牌后的列表啦~
内容的提问来源于stack exchange,提问作者EManual
相关产品推荐
相关产品推荐

