Groovy对比两个Map集合脚本输出异常,请求调试帮助
Map集合对比重复输出问题排查
需求说明
- 对比两个Map集合,判断第二个集合(
mj)的元素名称是否包含第一个集合(m)中分组为3#Gotowe do akceptacji的元素名称 - 仅打印
mj中不包含上述元素名称的条目,预期仅输出xoxoxoxx
现有代码
def m = [ [id: 7144, name: "Test załącznika.docx", group: "3#Gotowe do akceptacji"], [id: 7145, name: "Test załącznika 2.docx", group: "3#Gotowe do akceptacji"], [id: 7146, name: "Test integracji dział prawny cd..docx", group: "3#Gotowe do akceptacji"], [id: 7147, name: "Test załącznika 3.docx", group: "3#Gotowe do akceptacji"], [id: 7153, name: "Z.8.DRWS.P.01.F.01.PL.01 Wykaz dokumentów związanych i załączników.docx", group: "3#Gotowe do akceptacji"] ] def mj = [ [id: 24930, name: "Test integracji dział prawny cd. nowy.docx"], [id: 24931, name: "Test załącznika nowy.docx"], [id: 24932, name: "Test załącznika 3 nowa.docx"], [id: 23432, name: "xoxoxoxx.docx"], [id: 24933, name: "Test załącznika 2 nowy.docx"] ] m.each { webcFile -> def webcName = webcFile.name def webcGroup = webcFile.group def webcNameWithoutExtension = webcName.take(webcName.lastIndexOf('.')) mj.each { jiraFile -> def jiraName = jiraFile.name def jiraNameWithoutExtension = jiraName.take(jiraName.lastIndexOf('.')) if (jiraNameWithoutExtension.contains(webcNameWithoutExtension) && webcGroup == "3#Gotowe do akceptacji") { } else if (!jiraNameWithoutExtension.contains(webcNameWithoutExtension)) { println(jiraNameWithoutExtension) } } }
实际输出
Test integracji dział prawny cd. nowy xoxoxoxx Test integracji dział prawny cd. nowy Test załącznika nowy Test załącznika 3 nowa xoxoxoxx Test załącznika nowy Test załącznika 3 nowa xoxoxoxx Test załącznika 2 nowy Test integracji dział prawny cd. nowy Test załącznika nowy xoxoxoxx Test załącznika 2 nowy Test integracji dział prawny cd. nowy Test załącznika nowy Test załącznika 3 nowa xoxoxoxx Test załącznika 2 nowy
问题原因
- 嵌套循环导致重复输出:原代码用
m.each嵌套mj.each,每一对不匹配的元素都会触发一次打印。比如xoxoxoxx和m中5个元素都不匹配,就会被输出5次。 - 逻辑判断顺序错误:先遍历
m的所有元素,再逐个对比mj元素,没有判断mj元素是否完全不匹配所有m中指定分组的名称。
修正方案
- 先从
m中筛选出分组为3#Gotowe do akceptacji的元素,提取它们的无后缀名称,存入集合方便快速校验。 - 遍历
mj的每个元素,去掉后缀后,检查该名称是否未包含任何一个m中指定分组的无后缀名称。 - 满足条件的条目仅打印一次。
修正后代码
def m = [ [id: 7144, name: "Test załącznika.docx", group: "3#Gotowe do akceptacji"], [id: 7145, name: "Test załącznika 2.docx", group: "3#Gotowe do akceptacji"], [id: 7146, name: "Test integracji dział prawny cd..docx", group: "3#Gotowe do akceptacji"], [id: 7147, name: "Test załącznika 3.docx", group: "3#Gotowe do akceptacji"], [id: 7153, name: "Z.8.DRWS.P.01.F.01.PL.01 Wykaz dokumentów związanych i załączników.docx", group: "3#Gotowe do akceptacji"] ] def mj = [ [id: 24930, name: "Test integracji dział prawny cd. nowy.docx"], [id: 24931, name: "Test załącznika nowy.docx"], [id: 24932, name: "Test załącznika 3 nowa.docx"], [id: 23432, name: "xoxoxoxx.docx"], [id: 24933, name: "Test załącznika 2 nowy.docx"] ] // 提取m中指定分组的无后缀名称集合 def targetNames = m.findAll { it.group == "3#Gotowe do akceptacji" } .collect { it.name.take(it.name.lastIndexOf('.')) } // 遍历mj,检查每个元素是否不匹配所有targetNames mj.each { jiraFile -> def jiraNameWithoutExt = jiraFile.name.take(jiraFile.name.lastIndexOf('.')) // 判断是否没有任何一个targetName被包含在当前名称中 def hasNoMatch = targetNames.every { !jiraNameWithoutExt.contains(it) } if (hasNoMatch) { println(jiraNameWithoutExt) } }
验证结果
输出内容:
xoxoxoxx
完全符合预期。
内容的提问来源于stack exchange,提问作者mikol
相关产品推荐
相关产品推荐

