25

ハッシュテーブルがあります。values() メソッドは、挿入された順序とは異なる順序で値を返します。挿入された順序と同じ順序で値を取得するにはどうすればよいですか?LinkedHashmap を使用することも代替手段ですが、同期されません。

4

5 に答える 5

36

を使用しLinkedHashMapます。

Map予測可能な反復順序を備えた、インターフェースのハッシュ テーブルとリンク リストの実装。HashMapこの実装は、すべてのエントリを実行する二重リンク リストを維持するという点でとは異なります。この連結リストは反復順序を定義します。これは通常、キーがマップに挿入された順序 ( insert-order ) です。キーがマップに再挿入されても、挿入順序は影響を受けないことに注意してください。 (キー k は、呼び出しの直前に返さm.put(k, v)れるときに呼び出された 場合、マップ m に再挿入され ます。)m.containsKey(k)true

と組み合わせるCollections.synchronizedMap()

たとえば、次のようになります。

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());
于 2009-09-14T04:47:08.557 に答える
4

をラップしLinkedHashMapて同期するか、Collections.synchronizedMapユーティリティを使用して同期を作成することができLinkedHashMapます。

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

JavaDoc から:

複数のスレッドがリンクされたハッシュ マップに同時にアクセスし、少なくとも 1 つのスレッドがマップを構造的に変更する場合は、外部で同期する必要があります。これは通常、マップを自然にカプセル化するオブジェクトを同期することによって実現されます。そのようなオブジェクトが存在しない場合は、Collections.synchronizedMap メソッドを使用してマップを「ラップ」する必要があります。これは、マップへの偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。

于 2009-09-14T04:49:29.457 に答える
3

ハッシュテーブルがソートされていない理由は、保存と検索の速度を向上させるためだと確信しています。このため、外部構造を使用して順序を維持し、ハッシュテーブルを使用して値を格納することをお勧めします (高速検索用)。

于 2009-09-14T04:47:27.403 に答える
2

ハッシュ テーブルは本質的に順序付けされていないため、間違ったデータ構造を使用しています。使用している言語が指定されていないため、別の言語を提案することはできませんが、ある種の順序付けられたキー/値セットが必要です。

于 2009-09-14T04:46:02.727 に答える
1

jdk1.6の場合、順序付けされたマップEnumMapとLinkedHashMapの2つのタイプしかありません。両方とも同期されていません。注文を覚えておく必要がある場合は、

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

並べ替える場合は、ConcurrentSkipListMapを使用します

于 2009-10-23T19:17:10.957 に答える