Grails中的多对多映射

时间:2012-01-20 16:03:44

标签: grails

设备:[1.1:Acer C6,2:Acer C6,1:Acer C6,2.2:HTC Magic] files:[2:Tetris.apk,1:TheSims3.apk]

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

设备:[1.1:Acer C6,2:Acer C6,1:Acer C6,2.2:HTC Magic] files:[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 ] ]

        }

当前输出是 - 映射:[Acer C6:Tetris.apk,HTC Magic:Tetris.apk]

预期产量:[Acer C6:Tetris.apk,Acer C6:TheSims3.apk,HTC Magic:Tetris.apk]

1 个答案:

答案 0 :(得分:1)

您正在使用设备名称作为密钥累积结果。将新值添加到地图时,它会使用相同的键覆盖最后一个值。

您可以尝试累积到Set而不是地图。例如:

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