You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因

  1. 嵌套循环导致重复输出:原代码用m.each嵌套mj.each,每一对不匹配的元素都会触发一次打印。比如xoxoxoxx和m中5个元素都不匹配,就会被输出5次。
  2. 逻辑判断顺序错误:先遍历m的所有元素,再逐个对比mj元素,没有判断mj元素是否完全不匹配所有m中指定分组的名称。

修正方案

  1. 先从m中筛选出分组为3#Gotowe do akceptacji的元素,提取它们的无后缀名称,存入集合方便快速校验。
  2. 遍历mj的每个元素,去掉后缀后,检查该名称是否未包含任何一个m中指定分组的无后缀名称。
  3. 满足条件的条目仅打印一次。

修正后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:58:12