web-dev-qa-db-ja.com

ハッシュテーブル内の要素の順序を維持する方法

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

23
Thomas Manalil

LinkedHashMap を使用します。

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

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

したがって、たとえば:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());
35
cletus

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

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

JavaDocから:

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

4
akf

ハッシュテーブルがソートされていない理由は、ストレージと取得の速度を上げるためだと確信しています。このため、外部構造を使用して順序を維持し、ハッシュテーブルを使用して値を格納することをお勧めします(高速ルックアップのため)。

3
Nippysaurus

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

2
Ed S.

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

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

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

1
DKSRathore