2012-01-20 1 views
1

устройства: [1.1: Acer C6, 2: Acer C6, 1: Acer C6, 2.2: HTC Magic] файлов: [2: Tetris.apk, 1: TheSims3.apk]многие ко многим отображения в Grails

У меня есть отображение файлов и devies, на данный момент это сопоставление «один ко многим».

устройства: [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]

Ожидаемый выход ut: [Acer C6: Tetris.apk, Acer 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

Смежные вопросы