加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在groovy中复制列表列表

发布时间:2020-12-14 16:25:12 所属栏目:大数据 来源:网络整理
导读:我想执行一个副本并获得两个不同的对象,以便我可以在不影响原始文件的情况下处理副本. 我有这个代码(groovy 2.0.5): def a = [[1,5,2,1,1],["one","five","two","one","one"]]def b = ab.add([6,6,6])println aprintln b 产生: [[1,[one,five,two,one,one]
我想执行一个副本并获得两个不同的对象,以便我可以在不影响原始文件的情况下处理副本.

我有这个代码(groovy 2.0.5):

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

产生:

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

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

我可以用这种方式解决它:

def a = [[1,"one"]]
def b = []

a.each {
    b.add(it)
}

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

产生我想要的结果:

[[1,one]]
[[1,6]]

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

def a = [[1,"one"]]
def b = a

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

println a
println b

产生:

[[1,5],[five,two]]
[[1,two]]

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

def a = [[1,"one"]]
def b = []

a.each { 
    b.add(it)
}

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

println a
println b

仍然产生:

[[1,two]]

这是怎么回事 ?

解决方法

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

使用a.each {b.add(it)}调用第二个方法意味着b指向List的不同实例,但b的内容与列表中的实例相同

你需要的是:

def b = a*.collect()

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

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

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

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

将false传递给unique并对stop those method changing the original lists进行排序,并强制它们返回新的列表实例.

(事实上??,你们中间的观察者会注意到排序不需要传递给它,因为我们已经有了一个新的实例,这要归功于独特的)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读