много-много картографирования в Grails - PullRequest
1 голос
/ 20 января 2012

устройства: [1.1: Acer C6, 2: Acer C6, 1: Acer C6, 2.2: HTC Magic] файлы: [2: Tetris.apk, 1: TheSims3.apk]

У меня естьсопоставление файлов и устройств, теперь их сопоставление «один ко многим».

устройства: [1.1: Acer C6, 2: Acer C6, 1: Acer C6, 2.2: HTC Magic] файлы: [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 Ответ

1 голос
/ 20 января 2012

Вы накапливаете свои результаты, используя имя устройства в качестве ключа.Когда новое значение добавляется на карту, оно перезаписывает последнее с тем же ключом.

Вы можете попробовать накапливаться в наборе вместо карты.Пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...