gpt4 book ai didi

groovy - 复制 groovy 中的列表列表

转载 作者:行者123 更新时间:2023-12-02 08:28:30 26 4
gpt4 key购买 nike

我想执行复制并获取两个不同的对象,以便我可以在不影响原始对象的情况下处理副本。

我有这个代码(groovy 2.0.5):

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = a
b.add([6,6,6,6,6,6])
println a
println b

产生:

[[1, 5, 2, 1, 1], [one, five, two, one, one], [6, 6, 6, 6, 6, 6]]
[[1, 5, 2, 1, 1], [one, five, two, one, one], [6, 6, 6, 6, 6, 6]]

看起来b和a实际上是同一个对象

我可以用这种方式修复它:

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = []

a.each {
b.add(it)
}

b.add([6,6,6,6,6])
println a
println b

产生我想要的结果:

[[1, 5, 2, 1, 1], [one, five, two, one, one]]
[[1, 5, 2, 1, 1], [one, five, two, one, one], [6, 6, 6, 6, 6]]

但现在看看这个,我想要原始对象和具有唯一且已排序元素的副本:

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = a

b.each {
it.unique().sort()
}

println a
println b

产生:

[[1, 2, 5], [five, one, two]]
[[1, 2, 5], [five, one, two]]

如果我这次尝试相同的修复,它不起作用:

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = []

a.each {
b.add(it)
}

b.each {
it.unique().sort()
}

println a
println b

仍然产生:

[[1, 2, 5], [five, one, two]]
[[1, 2, 5], [five, one, two]]

发生什么事了?

最佳答案

只需调用 b = ab 设置为与 a 相同的列表实例(包含相同的列表实例)

使用 a.each { b.add(it) } 调用第二个方法意味着 b 指向 List 的另一个实例,但 b 的内容是与 a

中相同的列表实例

您需要的是:

def b = a*.collect()

b.each {
it.unique().sort()
}

因此,a*.collect()a 中的每个列表创建一个新的列表实例

您也可以在一行中完成此操作:

def b = a*.unique( false )*.sort( false ) 

false 传递给 uniquesort stop those method changing the original lists ,并强制它们返回新的列表实例。

(事实上,细心的人会注意到 sort 不需要将 false 传递给它,因为我们已经有了一个新实例,这要归功于 独特)

关于groovy - 复制 groovy 中的列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13306099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com