2017-08-30 76 views
0

需要一些基于两个键合并2个LinkedHashMaps的ArrayLists的帮助。如何使用groovy合并2个LinkedHashMaps的ArrayLists

这里的数据是什么样子:

​def searchResults = [ 
    [dId:"prod_000001", groupName:"Group 1", subjectName:"Subject 1", dTitle:"Title 1"], 
    [dId:"prod_000002", groupName:"Group 1", subjectName:"Subject 1", dTitle:"Title 2"], 
    [dId:"prod_000003", groupName:"Group 1", subjectName:"Subject 2", dTitle:"Title 3"], 
    [dId:"prod_000004", groupName:"Group 2", subjectName:"Subject 1", dTitle:"Title 4"] 
] 

def groupInfo = [ 
    [groupName:"Group 1", groupId:"01", subjectName:"Subject 1", subjectSortOrder:"01"], 
    [groupName:"Group 1", groupId:"01", subjectName:"Subject 2", subjectSortOrder:"02"], 
    [groupName:"Group 1", groupId:"01", subjectName:"Subject 3", subjectSortOrder:"03"], 
    [groupName:"Group 2", groupId:"02", subjectName:"Subject 1", subjectSortOrder:"01"] 
] 

我需要基于组名和主旨名称,像SearchResult所合并来自GROUPINFO属性:

def mergedResults = mergeResults(searchResults,groupInfo,["groupName","subjectName"]) 

这将导致:

mergedResult = [ 
    [dId:"prod_000001", groupName:"Group 1", subjectName: "Subject 1", dTitle: "Title 1", groupID:"01", subjectSortOrder:"01"], 
    [dId:"prod_000002", groupName:"Group 1", subjectName: "Subject 1", dTitle: "Title 2", groupID:"01", subjectSortOrder:"01"], 
    [dId:"prod_000003", groupName:"Group 1", subjectName: "Subject 2", dTitle: "Title 3", groupID:"01", subjectSortOrder:"02"], 
    [dId:"prod_000004", groupName:"Group 2", subjectName: "Subject 1", dTitle: "Title 4", groupID:"02", subjectSortOrder:"01"] 
] 

回答

1

以下行代码:

def mergedResults = searchResults.collect { searchResult -> 
    searchResult + groupInfo.find { 
     it.groupName == searchResult.groupName && 
     it.subjectName == searchResult.subjectName 
    } 
} 

在这里,第二备选方案:

def mergedResults = [searchResults, groupInfo] 
    .combinations() 
    .findAll { 
     x, y -> x.groupName == y.groupName && 
       x.subjectName == y.subjectName 
    } 
    .collect { it.sum() } 

并与建设中的查找地图第三方案:

def keyFn = { it.subMap 'groupName', 'subjectName' } 
groupInfo = groupInfo.collectEntries { [keyFn(it), it] } 
def mergedResults = searchResults.collect { it + (groupInfo[keyFn(it)] ?: [:]) } 
0

要获得更快的查找,我在 倒是groupBygroupInfo首先需要subMap(["groupName", "subjectName"])。然后遍历searchResults, 看是否有在groupInfo的条目,并把它们合并全身。

def keyFn = { it.subMap(["groupName", "subjectName"]) } 

def searchResults = [ 
    [dId:"prod_000001", groupName:"Group 1", subjectName:"Subject 1", dTitle:"Title 1"], 
    [dId:"prod_000002", groupName:"Group 1", subjectName:"Subject 1", dTitle:"Title 2"], 
    [dId:"prod_000003", groupName:"Group 1", subjectName:"Subject 2", dTitle:"Title 3"], 
    [dId:"prod_000004", groupName:"Group 2", subjectName:"Subject 1", dTitle:"Title 4"] 
] 

def groupInfo = [ 
    [groupName:"Group 1", groupId:"01", subjectName:"Subject 1", subjectSortOrder:"01"], 
    [groupName:"Group 1", groupId:"01", subjectName:"Subject 2", subjectSortOrder:"02"], 
    [groupName:"Group 1", groupId:"01", subjectName:"Subject 3", subjectSortOrder:"03"], 
    [groupName:"Group 2", groupId:"02", subjectName:"Subject 1", subjectSortOrder:"01"] 
].groupBy(keyFn) // XXX note the groupBy 

// merge all search results by groupname/subjectName keys into each searchResult 
def mergedResult = searchResults.collect{ 
    (groupInfo[keyFn(it)]?:[]).inject(it){ a,b -> a+b } 
} 

assert mergedResult == [ 
    [dId:"prod_000001", groupName:"Group 1", subjectName: "Subject 1", dTitle: "Title 1", groupId:"01", subjectSortOrder:"01"], 
    [dId:"prod_000002", groupName:"Group 1", subjectName: "Subject 1", dTitle: "Title 2", groupId:"01", subjectSortOrder:"01"], 
    [dId:"prod_000003", groupName:"Group 1", subjectName: "Subject 2", dTitle: "Title 3", groupId:"01", subjectSortOrder:"02"], 
    [dId:"prod_000004", groupName:"Group 2", subjectName: "Subject 1", dTitle: "Title 4", groupId:"02", subjectSortOrder:"01"] 
]