如何在kotlin中克隆或复制列表

时间:2017-10-20 09:19:32

标签: list copy kotlin

如何在Kotlin中复制列表?

我正在使用

val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)

有更简单的方法吗?

13 个答案:

答案 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所暗示的那样,这意味着要确保IterableList(就像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())