2017-02-16 40 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"]

所望の出力:LinkedHashMap種類は、彼らが追加された順序でエントリをマップ["id:1234, created:16-Feb-2017, subject:Bar, status:Foo, priority:low"]

+0

、共通のコレクションから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のマップリテラルで使用されるクラスです。上で示唆したのと同じことを試してみてください。しかし、2番目のマップは '[:]'で開始してください。挿入されたキーを正確に並べる必要があります。 – BalRog

答えて

0

標準のJavaクラス。また、実際には、Groovyの「マップ・リテラル」構文を使用するときに作成される実際のオブジェクトは、実際にはLinkedHashMapです。だから、あなたが望む効果を得ることがリテラル空のマップを作成し、目的のために、既存のマップからエントリを追加するのと同じくらい簡単です:代わりにHashMapの

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

関連する問題