我有一个文件和devies的映射,截至目前它是一对一的映射。
现在我需要实现一对多映射(单个文件到多个设备)
我的一对一映射逻辑是
deviceMapping = new Properties();
params.files.eachWithIndex { file, i ->
def device = devices["${file.key}"]
deviceMapping.put("${device}", "${file.value}");
}
我尝试过不同的方式,不支持我的一对多映射
devices :[1.2:SonyEricsson X10i, 1:Samsung I9000 Galaxy, 0:Acer C6, 0.1:HTC Magic]
params files from screen :[0:TheSims3.apk, 1:Tetris.apk]
device mapping :[Acer C6:TheSims3.apk, Samsung I9000 Galaxy:Tetris.apk]
我想要的是:
[Acer C6:TheSims3.apk, Samsung I9000 Galaxy:Tetris.apk, SonyEricsson X10i:Tetris.apk, HTC Magic:TheSims3.apk]
答案 0 :(得分:0)
您没有解释您的地图的工作原理......
但假设你是根据设备版本的第一个字符(?)将设备映射到文件,那么给出:
def devices = [ '1.2': 'SonyEricsson X10i',
'1' : 'Samsung I9000 Galaxy',
'0' : 'Acer C6',
'0.1': 'HTC Magic' ]
def files = [ '0':'TheSims3.apk', '1':'Tetris.apk' ]
您可以执行以下操作:
def mapping = devices.collectEntries { ver, name ->
// Get the first part of the version (up to the first dot)
def v = ver.split( /\./ )[ 0 ]
[ (name): files[ v ] ]
}
或者,如果您在1.7.9之前使用的是Groovy版本,则可以使用inject
代替collectEntries
:
def mapping = devices.inject( [:] ) { map, dev ->
// Get the first part of the version (up to the first dot)
def v = dev.key.split( /\./ )[ 0 ]
map << [ (dev.value): files[ v ] ]
}
提供将设置为的变量mapping
:
[ "SonyEricsson X10i":"Tetris.apk",
"Samsung I9000 Galaxy":"Tetris.apk",
"Acer C6":"TheSims3.apk",
"HTC Magic":"TheSims3.apk" ]