web-dev-qa-db-ja.com

グルービーでソートされたマップ

Groovyでソートされたマップを使用することに興味があります(グラフデータベースのDSLであるgremlinを使用)。

私はこれをここで見ました ブログ投稿 ここでソートされたマップについて==まだ混乱しています。

  • ソートされたマップはどのように宣言されますか?マップの標準的な方法とは異なりますかy = [:]

  • ソートされたマップを使用する場合、アイテムはリストに挿入された順に挿入されますか?または、並べ替えられたマップのアイテムを並べ替える前に、sort{}を実行する必要がありますか?

19
F21

次のようにマップを宣言するだけの場合:

def m = [:]

次に、GroovyがデフォルトでLinkedHashMapを作成するのを確認できます。

assert m.getClass().name == 'Java.util.LinkedHashMap'

LinkedHashMapのドキュメント を見ると、次のように書かれています。

Mapインターフェースのハッシュテーブルとリンクリストの実装、予測可能な反復順序。この実装は、すべてのエントリで実行される二重リンクリストを維持するという点でHashMapとは異なります。このリンクされたリストは、反復順序を定義します。これは、通常、キーがマップに挿入された順序(挿入順序)です。

したがって、LinkedHashMapには順序があり、sortを呼び出すことで、Groovyでその順序に影響を与えることができます。

def m = [ b:1, a:2 ]

// Sort by descending value
m = m.sort { -it.value }

println m // prints [a:2, b:1]

キーの自然な順序が必要な場合は、TreeMapなどのJavaのソートされたマップの1つを使用できます。

これを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]

TreeMapは、キーを追加しても順序を維持します。新しい値を追加しても、LinkedHashMapは自動的にソートされたままにはなりません。

40
tim_yates