java / groovy(文件到设备)中属性的一对多映射

时间:2011-12-14 12:21:54

标签: java groovy

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

现在我需要实现一对多映射(单个文件到多个设备)

我的一对一映射逻辑是

deviceMapping = new Properties();
params.files.eachWithIndex { file, i ->
            def device = devices["${file.key}"]
            deviceMapping.put("${device}", "${file.value}");
        }

我尝试过不同的方式,不支持我的一对多映射

  1. 我尝试循环浏览设备以映射文件
  2. 尝试将设备的字符串值剪切为映射文件
  3. 当前输出

    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]
    

1 个答案:

答案 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" ]