2012-06-08 9 views
8

aのキーをbの値にマッピングして、辞書として機能する対の単純なリスト[(a,b)]のような振る舞いをするタイプを使用したいと思います。指定されたキーの順序。 (つまり、通常のリストと同じように、「最後の要素」として認識されるアイテムを「追加」できるようにしたいと思っています)。しかし、線形のパフォーマンスよりも優れたキー、つまり何のためのランダムアクセスルックアップを希望しますか?Data.Map提供します。同期中に二つの重要なコレクションを保つことなど、定義済みのキー順を持つ辞書型

data OrderedDict a b = OrderedDict (Map a b) [a] 

、その後append操作を定義:1つのオプションは、ちょうど彼らの順序を定義するキーのリストに加えて、通常のマップを維持するだろう。同じキーの2つの別々のコレクションを維持することは醜いようです。キーによる効率的なランダムアクセスルックアップを備えた順序付けされたキーを既に組み合わせた既製のデータ型はありますか?

+0

Javaの[LinkedHashMap](http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html)は、同様のことをするようです:マップを介してキーのリストをスレッドします。 PythonのOrderedDictは単なるペアのリストなので、ここでは何の助けにもなりません。 –

+1

「定義済みの注文」とはどういう意味ですか? 'a1'と' a2'の2つのキーが与えられている場合、 'a1'が' a2'に先行するか、実行時に決定される優先順位かは事前に固定されていますか? – Peter

+1

@peter通常のリストと同じ意味で '定義された順序'を意味します - もし 'a1'を追加した後に' a2'を追加すると、 'a1'が' a2'の前に追加されます – gcbenison

答えて

3

あなたの質問を完全に誤解しない限り、Data.MapはキータイプのOrdインスタンスを使用して注文します。これはバイナリツリーなので、実装ではキーの順序も保持されます。

Data.Map.keysは、マップのキーを昇順で表示します。 mapなどの変換は純粋に機能的であり、トラバーサルの順序は無関係であり、キーまたはキー/値のペアのシーケンスをマップから取得するすべての方法で、順序付きリストが得られます。あなただけのOを持っていることのほかに、いくつか固定ため(例えば挿入時間)を保持したい場合は

+9

gcbenisonは 'Data .Map'がキーの挿入順序を保持するという追加の特性を持っています。 – huon

+0

カスタムキータイプをお持ちの場合は、独自の注文を定義することができます。しかし、順序は手続き的に生成できる場合にのみ機能します。 – Evi1M4chine

3

あなたは、単に複数のマップを使用することができ、検索/挿入(Nを記録)し、それらを同時に更新:

  1. 実際のデータを格納するためのMap a bと、順番にi番目のキーを与える
  2. Map Int aがあります。 (あなたも、あなたがMap a Intを追加することができ、特定のキーのインデックスを照会する必要がある場合)
4

ixsetライブラリを見てください - それは(aで、あなたの内Intによって複数の列でインデックス化セットを維持することができます場合)。これは、手作業でマップを一貫性を保つよりもはるかに保守的です。

+0

ありがとうございます - 'ixset'はクールです。私は、このケースでは、同じ状態(複数のエントリが同じ 'Int'フィールドを持つ)を許す可能性があり、呼び出し側が明示的にインデックスを指定するために' append'操作を実行する必要があるため、通常のリストで必要です。 – gcbenison

関連する問題