在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进行排序,并强制它们返回新的列表实例. (事实上??,你们中间的观察者会注意到排序不需要传递给它,因为我们已经有了一个新的实例,这要归功于独特的) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |