次のようにマップを宣言するだけの場合:
def m = [:]
次に、Groovy がデフォルトでLinkedHashMap
assert m.getClass().name == 'java.util.LinkedHashMap'
LinkedHashMapのドキュメントを見ると、次のように書かれています。
Map インターフェイスのハッシュ テーブルとリンク リストの実装で、反復順序が予測可能です。この実装が HashMap と異なる点は、そのすべてのエントリを実行する二重リンク リストを維持することです。この連結リストは反復順序を定義します。これは通常、キーがマップに挿入された順序 (挿入順序) です。
順序LinkedHashMap
があり、Groovy で呼び出してその順序に影響を与えることができます。sort
def m = [ b:1, a:2 ]
// Sort by descending value
m = m.sort { -it.value }
println m // prints [a:2, b:1]
キーの自然な順序付けが必要な場合は、次のような Java のソート済みマップの 1 つを使用できます。TreeMap
これを Groovy で使用したい場合は、次のようにします。
// def tm = [ tim_yates:1, F21:2 ] as TreeMap // works as well
TreeMap tm = [ tim_yates:1, F21:2 ]
次に、これを印刷すると、キー順に並べられていることがわかります。
println map // prints [F21:b, tim_yates:a]
キーを追加すると、 ATreeMap
は順序を維持します。新しい値を追加しても、 ALinkedHashMap
は自動的に並べ替えられたままになりません。