的方法GroovyCollections#transpose()可以從兩個列表生成對的列表:
groovy:000> [[1,2,3], [4,5,6]].transpose()
===> [[1, 4], [2, 5], [3, 6]]
如果你有在同一順序相同的帳戶代碼的兩個列表,你可以壓縮並行列表條目成對的地圖用轉置方法,然後合併各對的地圖:
[budProp, budCyExp].transpose().collect { it[0] + it[1] }
以下是groovysh細分,以便可以看到分別調換的結果如下步驟:
groovy:000> budProp = [[ACCTCODE:6201, BUDGET:2500], [ACCTCODE:7999, BUDGET:1500]]
===> [[ACCTCODE:6201, BUDGET:2500], [ACCTCODE:7999, BUDGET:1500]]
groovy:000> budCyExp = [[ACCTCODE:6201,cYBudget:1000],[ACCTCODE:7999,cYBudget: 2000]]
===> [[ACCTCODE:6201, cYBudget:1000], [ACCTCODE:7999, cYBudget:2000]]
groovy:000> [budProp, budCyExp].transpose()
===> [[[ACCTCODE:6201, BUDGET:2500], [ACCTCODE:6201, cYBudget:1000]], [[ACCTCODE:7999, BUDGET:1500], [ACCTCODE:7999, cYBudget:2000]]]
groovy:000> _.collect { it[0] + it[1] }
===> [[ACCTCODE:6201, BUDGET:2500, cYBudget:1000], [ACCTCODE:7999, BUDGET:1500, cYBudget:2000]]
在現實生活中,我會猶豫不決,除非我100%確定平行列表完美排列(一個列表中的每個帳戶代碼都在另一個列表中),否則我會做類似的事情:
groovy:000> budMap = budProp.inject([:]) { m, e -> m[e['ACCTCODE']] = e['BUDGET']; m }
===> [6201:2500, 7999:1500]
groovy:000> cyMap = budCyExp.inject([:]) { m, e -> m[e['ACCTCODE']] = e['cYBudget']; m }
===> [6201:1000, 7999:2000]
groovy:000> (budMap.keySet() + cyMap.keySet()).collect { [ACCTCODE: it, BUDGET: budMap[it], cYBudget: cyMap[it] ] }
===> [[ACCTCODE:6201, BUDGET:2500, cYBudget:1000], [ACCTCODE:7999, BUDGET:1500,
cYBudget:2000]]
這並不短,但它處理的情況是一個列表中的賬戶沒有在另一個列表中表示。
非常感謝。這正是我需要的。你對這些列表沒有完全排隊,他們沒有,但我認爲一個答案會指向正確的方向,我必須弄清楚其餘的,但是你給了我所需要的全部內容它。 – Greg