我有一个清单:
def a = [[14, 17, 12, 5], [14, 17, 12, 8, 3], [5, 2], [9]]
我需要检查交叉点,如果两个列表相交,请将它们组合起来。
结果应如下所示:
def b = [[14, 17, 12, 5, 8, 3, 2], [9]]
(即 14 在第一个子列表中,它也在第二个子列表中,以此类推……)如何解决此任务?
我有一个清单:
def a = [[14, 17, 12, 5], [14, 17, 12, 8, 3], [5, 2], [9]]
我需要检查交叉点,如果两个列表相交,请将它们组合起来。
结果应如下所示:
def b = [[14, 17, 12, 5, 8, 3, 2], [9]]
(即 14 在第一个子列表中,它也在第二个子列表中,以此类推……)如何解决此任务?
您可以在 Groovy 中执行以下操作:
def a = [[14, 17, 12, 5], [14, 17, 12, 8, 3], [5, 2], [9]]
def rslt = a.inject( [ ] ) { c, n ->
for( cc in c ) {
if( n.find { it in cc } != null ) {
cc.addAll( n )
cc = cc.unique()
return c
}
}
c << n
}
assert rslt == [[14, 17, 12, 5, 8, 3, 2], [9]]
这是另一个在列表上使用 Groovy 的一些“启发”方法的示例
def a = [[14, 17, 12, 5], [14, 17, 12, 8, 3], [5, 2], [9]]
def res = a.inject([]){ acc,val ->
def isect = acc.find{ val.intersect(it)}?.with{ it.addAll(val - it) }
!isect ? acc << val : acc
}
assert res.containsAll([[14, 17, 12, 5, 8, 3, 2], [9]])