使用现有列表创建新地图

时间:2011-12-30 17:40:18

标签: groovy

我有一个包含以下值的列表:

  

[“HTC Magic”:“Tetris.apk”,“摩托罗拉Droid里程碑”:“TheSims3.apk”,   “Acer C6”:“TheSims3.apk”];

我想将此列表转换为类似

的地图
  

[Tetris.apk:[HTC Magic],TheSims3.apk:[摩托罗拉Droid Milestone,Acer   C6]

1 个答案:

答案 0 :(得分:1)

mapIn = ["HTC Magic":"Tetris.apk", "Motorola Droid Milestone":"TheSims3.apk", "Acer C6":"TheSims3.apk"]
mapOut = [:].withDefault { [] }
mapIn.each { k, v -> mapOut[v] << k }
mapOut
> [Tetris.apk:[HTC Magic], TheSims3.apk:[Motorola Droid Milestone, Acer C6]]

如果您不介意滥用模式,可以使用inject

mapOut = mapIn.inject([:].withDefault {[]}) { m, k, v -> m[v] << k; m }
> [Tetris.apk:[HTC Magic], TheSims3.apk:[Motorola Droid Milestone, Acer C6]]

如果您不介意如何获取值,可以使用groupEntriesBy

mapOut = mapIn.groupBy { it.value }
mapOut["TheSims3.apk"]*.key
> [Motorola Droid Milestone, Acer C6]