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

java/groovy中属性的一对多映射(文件到设备),java,groovy,Java,Groovy,我有一个文件和设备的映射,现在是一对一的映射 现在我需要实现一对多映射(单个文件到多个设备) 我的一对一映射逻辑是 deviceMapping = new Properties(); params.files.eachWithIndex { file, i -> def device = devices["${file.key}"] deviceMapping.put("${device}", "${file.value}");

我有一个文件和设备的映射,现在是一对一的映射

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

我的一对一映射逻辑是

deviceMapping = new Properties();
params.files.eachWithIndex { file, i ->
            def device = devices["${file.key}"]
            deviceMapping.put("${device}", "${file.value}");
        }
我尝试了不同的方法,但不支持一对多映射

  • 我试图通过设备循环映射文件
  • 试图剪切设备的字符串值以映射文件
  • 电流输出 我想要的是:

    [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 ] ]
    }
    
    或者,如果您使用的是Groovy 1.7.9之前的版本,则可以使用
    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 ] ]
    }
    

    在您所需的输出中,Motorola Droid Milestone发生了什么事?抱歉…已编辑…在不同场景中测试时出现了复制粘贴错误…很高兴您发现了它…谢谢Tim,但我收到了错误没有方法签名:java.util.Properties.collectEntries()适用于参数类型,让我修改代码并更新您,我仍然会遇到错误“没有方法签名:java.util.Properties.collectEntries()适用于参数类型”。您使用的是哪一版本的Groovy?少于1.7.9我想。。。更新为
    inject
    variantgroovy 1.8.2…不确定为什么它没有反映…是因为我使用的是intellij IDEA的免费版本吗?因为在community edition中,几乎没有什么东西对我不起作用……让我先用inject测试一下,然后再回复您……啊……这是因为
    devices
    是一个
    Properties
    对象,而不是像我的示例代码中那样的
    Map
    。。。一秒钟。。。
    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" ]