2017-08-30 71 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"] 
]