2013-12-19 208 views
-1

我作爲具有相同的密鑰和值對

firstRecord = [ [ name1:'value1', name2:'value2', name3:'value3'], 
       [ name1:'value1', name2:'value4', name3:'value5' ] ] 

我拉列表具有抗名1的值作爲

valueList = [ 'value1', 'value1' ] 

我還有一個地圖記錄的地圖

secondRecord = [ value1:[ key1:'value9', key2:'value10' ] ] 

我試着循環瀏覽valueListsecondRecord.subMap([ value1.toString() ])

我有一張地圖作爲

[ value1: [ key1:'value9', key2:'value10' ] ] 

我想,如下圖(因爲有在valueList兩個相同的價值觀,我想有兩個鍵具有相同的值)

requiredMap = [ value1:[ key1:'value9', key2:'value10'], 
       value1:[ key1:'value9', key2:'value10' ] ] 

但因爲它是一張地圖,所以第二個覆蓋第一個地圖,我只留下一個鍵/值對。

這是可以實現的Groovy 1.5.6

+1

再次無效的Groovy代碼... ;-) –

+0

無效Groovy代碼。你爲什麼需要兼得?你可以按他們的計數分組。 – dmahapatro

+0

是的,但它並沒有真正的幫助,並沒有太多樂趣的一個晚上 –

回答

0

考慮:

firstRecord = [ [ name1:'value1', name2:'value2', name3:'value3'], 
       [ name1:'value1', name2:'value4', name3:'value5' ] ] 

您可以通過獲得valueList

valueList = firstRecord.name1 

然後,給出secondRecord

secondRecord = [ value1:[ key1:'value9', key2:'value10' ] ] 

你可以這樣做:

result = valueList.inject([:].withDefault { [] }) { m, v -> 
    m[ v ] << secondRecord[ v ] 
    m 
} 

,並提供:

assert result == [ value1:[ [ key1:'value9', key2:'value10'], 
          [ key1:'value9', key2:'value10' ] ] ] 

使用Groovy 1.5.6,你需要做的:

result = valueList.inject([:]) { m, v -> 
    if(!m[ v ]) { 
     m[ v ] = [] 
    } 
    m[ v ] << secondRecord[ v ] 
    m 
} 
+0

您好Tim,這是有效的1.5.6?這不適用於我 – Techie

+0

哪個位不工作?你有什麼錯誤? –

+0

@Techie無論如何,我找到了。已更新回答 –

相關問題