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

标签 java groovy

我有文件和设备的映射,到目前为止它是一对一的映射。

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

我的一对一映射逻辑是

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

我尝试了不同的方法,但不支持我的一对多映射

  1. 我尝试循环设备来映射文件
  2. 尝试将设备的字符串值剪切到映射文件

当前输出

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]

最佳答案

你没有解释你的映射是如何工作的......

但是假设您根据设备版本的第一个字符(?)将设备映射到文件,然后给出:

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 ] ]
}

给变量映射,将其设置为:

[ "SonyEricsson X10i":"Tetris.apk",
  "Samsung I9000 Galaxy":"Tetris.apk",
  "Acer C6":"TheSims3.apk",
  "HTC Magic":"TheSims3.apk" ]

关于java - java/groovy 中属性的一对多映射(文件到设备),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8504378/

相关文章:

Java,Jsoup,从html页面读取内容

java - 怎样才能正确地移动到对角线碰撞盒中并进行对角线移动?

shell - 通过gradle编写环境变量未显示在系统变量中

groovy - 在groovy中,如何动态调用类的静态方法?

java - 避免 EAV 模型但仍保持灵活性的最佳方法

java - Eclipse 一直忘记 JDK 合规性,将其设置为 1.6

java - 如何访问 jython 代码中的 javas ".class"属性?

java - 从 mysql 到 jdbc 的自定义错误

java - 正则表达式替换除星号和转义星号之外的所有特殊字符

groovy - Groovy中两个日期之间的持续时间