如何在Kotlin中克隆或复制一个列表

234

如何在 Kotlin 中复制列表?

我正在使用

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

有没有更简单的方法?


1
我认为你的解决方案已经是最简单的方法了,如果你不需要深度克隆的话。 - Serdar Samancıoğlu
复制列表只会复制项目的引用,而不会克隆项目本身。如果您希望拥有深度克隆的列表,请在复制列表时不要忘记克隆项目。 - CoolMind
15个回答

3

我会使用toCollection()扩展方法

val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())

这将创建一个新的MutableList,然后将原始列表中的每个元素添加到新创建的列表中。
在此处推断类型为MutableList<String>。如果您不想公开这个新列表的可变性,则可以将其类型声明为不可变列表。
val copy: List<String> = original.toCollection(mutableListOf())

2

在我看来,使用 Kotlin 的新版本(1.6+)中的集合构建器是最好的、最符合惯用方式的方法。

   val shallowListCopy = buildList { addAll(list) }

你为什么称它为“浅拷贝”?对函数的概述和行为测试显示它返回的是“深拷贝”,而不是“浅拷贝”。 - undefined
@Gleichmut 我是从物品的角度来说的...当然,这个列表是一个不同的实例,但它仍然引用了原始列表的元素。 - undefined
你是对的,这确实是一个“浅拷贝”。我编写了一个测试套件来确认它的行为。从你的角度来看,在现代的Kotlin中,你会建议使用什么作为“深拷贝”呢? - undefined
1
最好、最简单的方法是将模型作为数据类的结构,你可以无需额外成本地复制它们,就像维护自己的复制方法一样。 - undefined
1
listOf(instances).map{ it.copy() } - undefined
谢谢,我也想到了这个想法,但我还收集了一些信息,以防你的数据类的成员字段中有Collection,调用.copy()方法可能不会对该集合进行深拷贝。我还没有验证过。 - undefined

1

在尝试浅复制、深复制克隆和许多其他方法后,我发现这个解决方案肯定适合您。

val iterator: Iterator<Object> = yourList.iterator()
        while (iterator.hasNext())
        newList.add(iterator.next().copy())

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


-6

尝试以下代码来复制 Kotlin 中的列表

arrayList2.addAll(arrayList1.filterNotNull())

这并不是复制一个列表,而是将一个列表添加到现有列表中(因此结果将是ArrayList <ArrayList <T >>)。 - The Shwarma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接