2012-01-23 49 views
3

我有邏輯在我的後處理來處理的裝置和文件的值如下:(改變了這種從地圖,因爲它是重寫的值設置)轉換設定爲地圖常規

def deviceFiles = devices.inject([] as Set) { deviceFiles, device -> 
      def v = device.key.split(/\./)[0] 
      deviceFiles << [ (device.value), files[ v ] ] 
     } 

輸出: deviceFiles:[[宏基C6,Tetris.apk],[摩托羅拉Droid Milestone,Tetris.apk],[宏基C6,TheSims3.apk],[HTC Desire,TheSims3.apk]] - 看起來很好顯示

這些值將作爲地圖/屬性傳遞,以便在沒有任何投射異常的情況下正確顯示數據,我發現這些數據很難。

當通過該組環

deviceFiles.each { device -> 
      mapping.put("${device}", "${file}") 
     } 

輸出:映射:[HTC慾望:TheSims3.apk,摩托羅拉Droid里程碑:Tetris.apk,宏基C6:Tetris.apk] - 這是不正確(宏碁C6:TheSims3.apk已被覆蓋)

我在這裏丟失的東西發送預期值到地圖?或者無法通過地圖發送設置的值(因爲當我通過設備迭代時地圖總是消除重複的)。

回答

5

你可以使用collectEntries

def deviceFiles = devices.collectEntries { 
    device -> [device.value, device.key.split(/\./)[0]] 
} 
+0

我的常規版本不支持collectEntries,所以我已經注射 – Techie

+0

.collect {}實現應該工作一樣.collectEntries {} –

+0

@JarredOlson,collect {}可以工作,但我的要求並沒有在這裏實現,因爲它的說法不能將對象數組列表轉換爲屬性...嗯... – Techie

2

您可以使用groupBy這一點。假設你的集包括:

def deviceFiles = [["Acer", "test.apk"], ["Acer", "abc.apk"], ["HTC", "qwer.apk"]] 

def mapping = deviceFiles.groupBy { it[0] } 

會導致:

["Acer": [["Acer", "test.apk"], ["Acer", "abc.apk"]], "HTC": [["HTC", "qwer.apk"]]] 
+0

感謝您的答覆,但我的預期輸出是不是上面...我會給這個嘗試如果需要。再次感謝 – Techie