Groovy多数组重复元素查找及空数组兼容方案咨询
多Groovy数组求共同元素的实现方法
核心思路
利用Groovy的inject方法链式计算多个列表的交集,同时先过滤掉空列表,避免空数组干扰结果。
代码实现与场景示例
场景1:所有数组非空
// 注意:元素需用字符串包裹,避免被当作数值表达式计算 def Ids_AS = ['04-04350', '21-005676', 'REGU-132644681'] def Ids_AO = ['04-04350', '04-04356', 'REGU-132644681'] def Ids_AV = ['04-04350', 'AB-132644681', 'REGU-132644681'] // 过滤掉空列表 def nonEmptyLists = [Ids_AS, Ids_AO, Ids_AV].findAll { !it.isEmpty() } // 链式计算交集:用第一个列表作为初始值,依次和后续列表求交集 def commonElements = nonEmptyLists.isEmpty() ? [] : nonEmptyLists.inject { acc, list -> acc.intersect(list) } println(commonElements) // 输出:[04-04350, REGU-132644681]
场景2:包含空数组
def Ids_AS = ['04-04350', '21-005676', 'REGU-132644681'] def Ids_AO = ['04-04350', '04-04356', 'REGU-132644681'] def Ids_AV = [] def nonEmptyLists = [Ids_AS, Ids_AO, Ids_AV].findAll { !it.isEmpty() } def commonElements = nonEmptyLists.isEmpty() ? [] : nonEmptyLists.inject { acc, list -> acc.intersect(list) } println(commonElements) // 输出:[04-04350, REGU-132644681]
边界情况:所有数组为空
如果传入的所有数组都是空列表,上述代码会返回空列表,避免报错:
def list1 = [] def list2 = [] def list3 = [] def nonEmptyLists = [list1, list2, list3].findAll { !it.isEmpty() } def commonElements = nonEmptyLists.isEmpty() ? [] : nonEmptyLists.inject { acc, list -> acc.intersect(list) } println(commonElements) // 输出:[]
关键说明
inject方法:将列表的第一个元素作为初始累积值,随后依次与每个后续列表执行intersect操作,逐步得到所有列表的共同元素。- 空列表过滤:通过
findAll { !it.isEmpty() }排除空数组,确保只会在有效列表间计算交集,符合“空数组不干扰结果,匹配剩余数组重复元素”的需求。 - 元素格式:原代码中的元素(如
04-04350)需用单/双引号包裹为字符串,否则会被Groovy解析为数值运算(八进制数减整数),导致错误结果。
内容的提问来源于stack exchange,提问作者Shahid Ur Rehman
相关产品推荐
相关产品推荐

