如何在Kotlin中复制列表?
我正在使用
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
有更简单的方法吗?
答案 0 :(得分:75)
这很好用。
val selectedSeries = series.toMutableList()
答案 1 :(得分:7)
我可以提出两种替代方法:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
更新:使用新的类型推断引擎(在Kotlin 1.3中启用),我们可以在第一个示例中省略泛型类型参数,并具有以下功能:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
仅供参考。选择加入新推理的方法是,对于命令行使用kotlinc -Xnew-inference ./SourceCode.kt
,对于Gradle使用kotlin { experimental { newInference 'enable'}
。有关新的类型推断的更多信息,请观看以下视频:KotlinConf 2018 - New Type Inference and Related Language Features by Svetlana Isakova,尤其是“ 30的建筑商推断”
答案 2 :(得分:3)
对于浅表副本,我建议
.map{it}
这将适用于许多集合类型。
答案 3 :(得分:2)
这对我有用
selectedSeries = ArrayList(series.map { it.copy() })
答案 4 :(得分:2)
就像在Java中一样:
列表:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
地图:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
假设您以JVM(或Android)为目标;我不确定它是否适用于其他目标,因为它依赖于ArrayList和HashMap的副本构造函数。
答案 5 :(得分:2)
您可以使用ArrayList
构造函数:ArrayList(list)
答案 6 :(得分:1)
您可以使用
列表-> toList()
Array-> toArray()
ArrayList-> toArray()
MutableList-> toMutableList()
示例:
val array:ArrayList<String> = ArrayList()
array.add("1")
array.add("2")
array.add("3")
array.add("4")
val arrayCopy = array.toArray() // copy array to other array
Log.i("---> array " , array?.count().toString())
Log.i("---> arrayCopy " , arrayCopy?.count().toString())
array.removeAt(0) // remove first item in array
Log.i("---> array after remove" , array?.count().toString())
Log.i("---> arrayCopy after remove" , arrayCopy?.count().toString())
打印日志:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
答案 7 :(得分:1)
您可以使用提供的扩展名Iterable.toMutableList()
,该扩展名将为您提供一个新列表。不幸的是,正如其签名和documentation所暗示的那样,这意味着要确保Iterable
是List
(就像toString
和许多其他to<type>
方法一样)。没有什么可以保证您会成为新列表。例如,在扩展名的开头添加以下行:if (this is List) return this
是合理的性能改进(如果确实可以提高性能)。
此外,由于其名称,生成的代码也不是很清楚。
我更喜欢添加自己的扩展名以确保结果并创建更清晰的代码(就像我们对arrays所做的那样):
fun <T> MutableList<T>.copyOf(): MutableList<T> {
return mutableListOf<T>().apply { addAll(this) }
}
请注意,addAll
是最快的复制方法,因为它在System.arraycopy
的实现中使用了本地ArrayList
。
另外,请注意,这只会给您浅表副本。
答案 8 :(得分:1)
在尝试浅拷贝、深拷贝克隆等之后,我发现这个解决方案肯定对你有用。
val iterator: Iterator<Object> = yourList.iterator()
while (iterator.hasNext())
newList.add(iterator.next().copy())
答案 9 :(得分:0)
我会使用the toCollection()
extension method:
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
这将创建一个新的MutableList
,然后将原始元素的每个元素添加到新创建的列表中。
此处推断的类型将为MutableList<String>
。如果您不想公开此新列表的可变性,则可以将类型明确声明为不可变列表:
val copy: List<String> = original.toCollection(mutableListOf())
答案 10 :(得分:0)
对于简单列表,上面有许多正确的解决方案。
但是,它仅用于浅表。
以下功能适用于任何二维ArrayList
。实际上,ArrayList
等效于MutableList
。有趣的是,在使用显式MutableList
类型时,它不起作用。如果需要更多尺寸,则有必要提供更多功能。
fun <T>cloneMatrix(v:ArrayList<ArrayList<T>>):ArrayList<ArrayList<T>>{
var MatrResult = ArrayList<ArrayList<T>>()
for (i in v.indices) MatrResult.add(v[i].clone() as ArrayList<T>)
return MatrResult
}
整数矩阵的演示:
var mat = arrayListOf(arrayListOf<Int>(1,2),arrayListOf<Int>(3,12))
var mat2 = ArrayList<ArrayList<Int>>()
mat2 = cloneMatrix<Int>(mat)
mat2[1][1]=5
println(mat[1][1])
它显示12
答案 11 :(得分:0)
val selectedSeries = listOf(*series.toTypedArray())
答案 12 :(得分:-1)
尝试以下代码复制科特林
中的列表arrayList2.addAll(arrayList1.filterNotNull())