Groovy语言:如何在两个对列表之间获得差异
发布时间:2020-12-14 16:30:15 所属栏目:大数据 来源:网络整理
导读:我试图在Groovy语言中获得另一个对的列表.对只是(x,y)坐标,它们是唯一的. 以下是一个简单的小例子.请注意,列表可以有几十对. def l1 = [[x:1,y:1]] def l2 = [[x:0,y:0]] println l1 - l2 会得到[],这是一个空列表,但应该是这样的:[[x:1??,y:1]] 更新: f
我试图在Groovy语言中获得另一个对的列表.对只是(x,y)坐标,它们是唯一的.
以下是一个简单的小例子.请注意,列表可以有几十对. def l1 = [[x:1,y:1]] def l2 = [[x:0,y:0]] println l1 - l2 会得到[],这是一个空列表,但应该是这样的:[[x:1??,y:1]] 更新: for(n in l2) { l1 = l1 - n } 它有效,但它是一个黑魔法,并没有优化 解决方法
正如评论中所述,l1中的对是唯一的(或者更确切地说:它可以有独特的结果),然后你可以使用l1 / l2作为集合:
l1 = [[x:1,y:1]] l2 = [[x:0,y:0]] println l1.toSet()-l2.toSet() //; [[x:1,y:1]] 最初的问题是[x:0,y:0] vs [x:1,y:1]部分.原因是在 def cmp = new org.codehaus.groovy.runtime.NumberAwareComparator() println cmp.compare(l1[0],l2[0]) //; 0 (equal!) 这简单归结为: assert [x:1,y:1].hashCode() == [x:0,y:0].hashCode() // 120^1 + 121^1 == 120^0 + 121^0 编辑替代方案(如果你可以摆脱地图) 由于这看起来不是很好的基础,你可能最好使用保存和声音类似的数据类.例如.: @groovy.transform.Immutable class Pair { long x,y } def p00 = new Pair(0,0) def p11 = new Pair(1,1) def p11o = new Pair(1,1) assert [p00]-[p11] == [p00] assert [p11]-[p00] == [p11] assert [p00].intersect([p11]) == [] assert [p11].intersect([p00]) == [] assert [p11].intersect([p11o]) == [p11] assert [p11].intersect([p11o]) == [p11o] 即使将地图转换为Expandos也能更好地工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |