简体   繁体   English

groovy / java检查列表交叉点和组合元素

[英]groovy/java check list intersections and combine elements

I have a list: 我有一个清单:

def a = [[14, 17, 12, 5], [14, 17, 12, 8, 3], [5, 2], [9]]

I need to check intersections and if two lists intersect, combine them. 我需要检查交叉点,如果两个列表相交,请将它们组合起来。

The result should be as follows: 结果应如下:

def b = [[14, 17, 12, 5, 8, 3, 2], [9]]

(ie 14 is in first sublist, which is also in second sublist, and recursively so on...) How this task can be solved? (即14位于第一个子列表中,也位于第二个子列表中,递归地依此类推......)如何解决此任务?

You can do something like this in Groovy: 你可以在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]]

Here is another example using some of Groovy's set "inspired" methods on lists 下面是另一个使用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]])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM