【问题标题】:groovy/java check list intersections and combine elementsgroovy/java 检查列表交叉点和组合元素
【发布时间】:2013-04-04 16:14:00
【问题描述】:

我有一个清单:

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

【问题讨论】:

  • 我尝试做两个 for 循环,其中第二个循环检查与第一个循环子列表的交集。他们要做flatten().unique()。但这不是正确的解决方案(我认为我在实施过程中犯了一些错误)
  • 为什么 8 和 3 最终会出现在大名单中?
  • 如果有相交的元素,我需要合并列表。
  • 那么任何列表中的任何相交元素都会拉入整个列表?
  • tim_yates:是的,拉入整个列表

标签: java list groovy intersection


【解决方案1】:

你可以在 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]]

【讨论】:

  • 有什么理由不a.inject([]) { c, n -&gt; ...
【解决方案2】:

这是另一个在列表上使用 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]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多