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

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]部分.原因是在public static <T> Collection<T> minus(Collection<T> self,Collection<?> removeMe).选择了n * n个分支,NumberAwareComperator认为两个映射都是相同的:

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也能更好地工作.

(编辑:李大同)

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

    推荐文章
      热点阅读