将Set转换为Map(Groovy)

3
我在后处理中有逻辑来处理设备和文件的值,如下所示:(将其从映射更改为设置,因为它会覆盖这些值)
def deviceFiles = devices.inject([] as Set) { deviceFiles, device ->
            def v = device.key.split( /\./ )[0]
            deviceFiles << [ (device.value), files[ v ] ]
        }

输出:设备文件:[[宏碁C6,俄罗斯方块.apk],[摩托罗拉Droid Milestone,俄罗斯方块.apk],[宏碁C6,模拟人生3.apk],[HTC Desire,模拟人生3.apk]] --- 看起来很好展示

这些值需要作为映射/属性传递,以便数据可以正确显示而不会出现任何强制转换异常,这是我发现很困难的。

当它通过集合循环时

deviceFiles.each { device  ->
            mapping.put("${device}", "${file}")
        }

输出结果: 映射:[HTC Desire:TheSims3.apk, Motorola Droid Milestone:Tetris.apk, Acer C6:Tetris.apk] -- 这不正确(Acer C6:TheSims3.apk已被覆盖)。

我是否错过了将期望值发送到映射中的步骤?或者说无法通过map发送set的值(因为当我遍历设备时,map总是消除重复项)???

2个回答

5
您可以使用 collectEntries 方法:collectEntries
def deviceFiles = devices.collectEntries {
    device -> [device.value, device.key.split(/\./)[0]]
}

我的Groovy版本不支持collectEntries,因此我已经实现了inject。 - Techie
@JarredOlson,collect{} 工作了,但我的要求在这里没有得到满足,因为它说无法将对象 ArrayList 转换为属性... 嗯嗯... - Techie
如果 inject 能够工作,我会选择它。否则,你可以通过循环以老式的方式创建属性 :) - Jarred Olson
实际上,注入函数分别作为映射和集合工作...但是,如果要将集合转换为映射,则需要循环并创建属性...嗯嗯...感谢大家的回复... - Techie
嗨,我尝试循环遍历集合,但当它再次添加到映射中时,会覆盖重复的值,如果将其添加到集合中,则与属性不兼容... 嗯,我正在编辑问题... - Techie

2
您可以使用groupBy来实现。假设您的数据集包含:
def deviceFiles = [["Acer", "test.apk"], ["Acer", "abc.apk"], ["HTC", "qwer.apk"]]

def mapping = deviceFiles.groupBy { it[0] } 

会导致:
["Acer": [["Acer", "test.apk"], ["Acer", "abc.apk"]], "HTC": [["HTC", "qwer.apk"]]]

谢谢您的回复,但我的预期输出不是像上面那样的...如果需要的话我会尝试这个。再次感谢。 - Techie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接