簡體   English   中英

Grails中的多對多映射

[英]many to many mapping in Grails

設備:[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]

您正在使用設備名稱作為鍵來累積結果。 將新值添加到地圖后,它將使用相同的鍵覆蓋最后一個值。

您可以嘗試累積到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM