按Groovy中定义的键顺序排序映射

时间:2017-02-16 10:29:38

标签: sorting groovy hashmap

我有一个配置文件来指定要从JSON文档中提取的字段,然后我想将其写入CSV文件。

目前,我正在遍历JSON文档并将指定的键和值分配给HashMap<String,Object>,然后将其添加到ArrayList<HashMap<String,Object>>。当从JSON文档中读取信息时,似乎填充了地图。

如何将地图按照配置文件中指定的字段顺序排序?我在网上搜索过,但只找到了如何按字母或数字排序的例子,这不是我想要的。

配置:"useFields":["id","created","subject","status","priority"]

当前输出:["created:16-Feb-2017, id:1234, priority:low, status:Foo, subject:Bar"]

所需的输出:["id:1234, created:16-Feb-2017, subject:Bar, status:Foo, priority:low"]

1 个答案:

答案 0 :(得分:0)

标准Java类LinkedHashMap按照添加顺序对映射条目进行排序。事实证明,使用Groovy“map literal”语法时创建的实际对象实际上是LinkedHashMap。因此,获得所需的效果就像创建空地图文字并按照所需顺序添加现有地图中的条目一样简单:

final useFields = ["id","created","subject","status","priority"]

def input = [created:"16-Feb-2017", id:1234, priority:"low", status:"Foo", subject:"Bar"]
println input

def output = [:]
useFields.each { output[it] = input[it] }
// or this one-liner:
// def output = useFields.inject([:]) { out, key -> out[key] = input[key]; out }
println output