Groovy 如何组合两个没有重复项的对象列表?

Groovy 如何组合两个没有重复项的对象列表?,groovy,Groovy,我有两个groovy sql结果集,我需要组合结果集,以便project\u no应该是唯一的,case\u no可以有多个元素,如果存在重复的project\u no 下面是2个groovy sql结果集 [[project_no:0-10001,case_no:00492268],[project_no:0-10160,case_no:01957580],[project_no:1-10014,case_no:02022686]] [[project_no:0-10160,case_no:

我有两个groovy sql结果集,我需要组合结果集,以便
project\u no
应该是唯一的,
case\u no
可以有多个元素,如果存在重复的
project\u no

下面是2个groovy sql结果集

[[project_no:0-10001,case_no:00492268],[project_no:0-10160,case_no:01957580],[project_no:1-10014,case_no:02022686]]

[[project_no:0-10160,case_no:01957590],[project_no:1-10014,case_no:019126],[project_no:1-2896337,case_no:02039596]]
期望列表

[[project_no:0-10001,case_nos:[00492268]], [project_no:0-10160,case_nos:[01957580,01957590]] ,[project_no:1-10014,case_nos:[02022686,019126]], [project_no:1-2896337,case_nos:[02039596]]]
这就是我尝试过的

caseResultForAnalysis.each { ca ->
    def ptmp = [:], caseList = []
    tempPrList.add(ca["project_no"])
    ptmp["project_no"] = ca["project_no"]
    caseList.add(ca["case_no"])
    if (caseList.size() > 0) {
        ptmp["case_nos"] = caseList
        mergedCaseResult.push(ptmp)
    }
}
mergedCaseResult.each { ma ->
    def ptmp = [:], caseList = []
    caseResultForUploads.each { cp ->
        if (!tempPrList.contains(cp["project_no"])) {
            ptmp["project_no"] = ma["project_no"]
            caseList.add(cp["case_no"])
        } else if (ma["project_no"] == cp["project_no"]) {
            //if (!ma["case_nos"].contains(cp["case_no"]))
            List tmp = ma["case_nos"]
            if (!tmp.contains(cp["case_no"]))
                ma["case_nos"].add(cp["case_no"])
        }
    }
    if (caseList.size() > 0) {
        ptmp["case_nos"] = caseList
        mergedCaseResult.push(ptmp)
    }
}

//1st list caseResultForAnalysis
//2nd List caseResultForUploads
//desired List mergedCaseResult

我相信这会更符合实际

下面是执行OP所需操作的脚本

def list1 = [[project_no:'0-10001',case_no:'00492268'],[project_no:'0-10160',case_no:'01957580'],[project_no:'1-10014',case_no:'02022686']]
def list2 = [[project_no:'0-10160',case_no:'01957590'],[project_no:'1-10014',case_no:'019126'],[project_no:'1-2896337',case_no:'02039596']]

def result = list1+list2
def projNos = result.inject([]) { keys, item ->  keys << item.project_no } as Set


def finalResult = []
projNos.each { proj ->
    //To avoid duplicate cases in project, using it as Set
    def cases = [] as Set
    result.each { item ->
        if (item.project_no == proj) {
            cases << item.case_no
        }
    }
    finalResult << [ 'project_no': proj, 'case_no' : cases ]
}

println finalResult
def列表1=[[项目编号'0-10001',案例编号'00492268',[项目编号'0-10160',案例编号'01957580',[项目编号'1-10014',案例编号'02022686']
def列表2=[[项目编号'0-10160',案例编号'01957590',[项目编号'1-10014',案例编号'019126',[项目编号'1-2896337',案例编号'02039596']]
def结果=列表1+列表2
def projNos=result.inject([]){keys,item->keys
//为避免项目中出现重复案例,请将其作为集合使用
def案例=[]已设置
result.each{item->
如果(item.project_no==proj){

cases您可以通过以下方式使其更“常规”:


如果列表1和列表2中存在重复的对象,则会创建一个具有重复案例编号的
案例编号
案例编号:[1,1]
对不起,没有收到您的邮件。您有样本吗?检查此项它将有重复的大小写。\u没有项目,它是我从mobile编辑的最后一个格式添加。为避免重复,您需要添加的是将
def cases=[]设置为设置的大小写。
@Rao“我确信这可以更具沟槽化。”接受挑战;-)我知道我是groovy的初学者。你是提高我groovy技能的灵感来源,从你无价的回复中学习了很多东西(在任何可能的情况下,这些回复几乎都是旁观者)并为我的许多Groovy答案奠定基础。非常感谢。如何保持每一个项目唯一的CaseNo?否?检查@饶AWW,谢谢!继续,这只是实践,这里回答问题是一个很好的方式来练习和帮助人们几乎是一个副作用:-D
def list1 = [[project_no:'0-10001',case_no:'00492268'],[project_no:'0-10160',case_no:'01957580'],[project_no:'1-10014',case_no:'02022686']]
def list2 = [[project_no:'0-10160',case_no:'01957590'],[project_no:'1-10014',case_no:'019126'],[project_no:'1-2896337',case_no:'02039596']]

def finalResult = (list1 + list2).groupBy { it.project_no }
                                 .collect { k, v -> [project_no:k, case_no:v.case_no.unique()] }