23

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

ここでソートされたマップに関するこのブログ投稿を見ましたが、それでも少し混乱しています。

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

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

4

1 に答える 1

49

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

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は自動的に並べ替えられたままになりません。

于 2012-11-16T09:27:05.947 に答える