0

我有一个清单:

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 在第一个子列表中,它也在第二个子列表中,以此类推……)如何解决此任务?

4

2 回答 2

2

您可以在 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]]
于 2013-04-04T16:27:12.500 回答
0

这是另一个在列表上使用 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]])
于 2013-04-08T02:43:48.310 回答