2017-02-16 95 views
0

我有一個配置文件來指定要從JSON文檔中提取的字段,然後我要寫入CSV文件。按照Groovy中定義的鍵順序排序映射

目前,我正在遍歷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"]

+0

而是一個HashMap的,採取從常見的集合看看ListOrderedMap: http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/ListOrderedMap.html – bdkosher

+0

謝謝。所以我假設我應該遍歷我的配置字段,使用該密鑰從JSON獲取內容,然後將其添加到ListOrderedMap?我會給你一槍! – Donglecow

+0

標準Java'LinkedHashMap'提供了相同的功能,並且它是Groovy中地圖文字使用的類。嘗試與上面建議的相同的事情,但只需用'[:]'開始第二張地圖。它應該按照插入的順序排列鍵。 – BalRog

回答

0

標準的Java類LinkedHashMap各種映射添加它們的順序條目。事實證明,使用Groovy「地圖文字」語法時創建的實際對象實際上是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 
+0

謝謝你指出這一點。這種方式正如你所描述的那樣,儘管我認爲我已經找到了一種更有效的內存方式,以便在我的程序的後期階段實現我不需要創建多個地圖實例的高效方法。 – Donglecow