2012-01-20 150 views
1

裝置:[1.1:宏基C6,2:宏基C6,1:宏基C6,2.2:HTC魔術] 文件:[2:Tetris.apk,1:TheSims3.apk]多對多映射Grails中

我有一個文件和devies的映射,截至目前它的一對多映射。

裝置:[1.1:宏基C6,2:宏基C6,1:宏基C6,2.2:HTC魔術] 文件:[2:Tetris.apk,1:TheSims3.apk]

現在我需要實現許多一對多映射

我一一對多映射邏輯是

mapping = params.devices.inject([:]) { map, dev -> 
      // Get the first part of the version (up to the first dot) 
      def v = dev.key.split(/\./)[ 0 ] 
      logger.debug("value of v :"+v) 
      map << [ (dev.value): files[ v ] ] 

     } 

電流輸出 - 映射:[宏基C6:Tetris.apk,HTC魔術:Tetris.apk]

預計出把:[宏基C6:Tetris.apk,宏碁C6:TheSims3.apk,HTC Magic:Tetris.apk]

回答

1

您正在積累使用設備名稱作爲關鍵的結果。當一個新值被添加到地圖中時,它將用相同的密鑰覆蓋最後一個值。

你可以嘗試累積到一個集合而不是地圖。例如:

def devices = ['1.1': 'Acer C6', '2': 'Acer C6', '1': 'Acer C6', '2.2': 'HTC Magic'] 
def files = ['2': 'Tetris.apk', '1': 'TheSims3.apk'] 

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

assert deviceFiles == [ 
    ['Acer C6', 'Tetris.apk'], 
    ['Acer C6', 'TheSims3.apk'], 
    ['HTC Magic', 'Tetris.apk'] 
] as Set 
+0

感謝提醒基礎:-)歡呼 – Techie

+0

嗨,在這種邏輯的後面幾頁,我已經使用屬性和方法,必須是不變的,請你讓我知道處理的更好的辦法這一套要轉換成地圖? – Techie