2012-05-23 9 views
5

Javaのクラスはありますか?これは、要素の配列を順番に保持し、高速検索に最適化されていますか?ハッシュされたインデックス付きリストまたは配列の両方ですか?

I.e.数値インデックス(Vectorなど)とハッシュ(HashMapなど)の両方で要素を取得する必要があります。

のLinkedHashMapは、私はそれが順序を保証するのでLinkedHashMapが一致していないと思いますが、高速のインデックス(位置番号)でアクセスすることはできません

と一致していません。説明によれば、所与の位置を見つけるためにチェーン全体を横断する必要がある。これは、イテレータを使用しているすべてのCollectionです。

EDIT 2

すなわち、キーとインデックスの両方で検索するのは、キーだけでなく、高速でなければなりません。

答えて

2

ハッシュによる要素の高速取得には、Mapを使用できます。定義によって、Mapは順序付けされておらず、索引について話すことはあまり意味がありません。それがインデックスで要素にアクセスするにはまだいくつかの余分な処理が必要になりますが、挿入順序は、反復時に保存されていることを保証するのでLinkedHashMapを使用すると、使用のかもしれないが、このような何か:

map.entrySet().toArray()[index] // mind the casts, etc. 

、まれにマップが変更された場合、配列をキャッシュし、インデックスのエントリにアクセスする前にマップのサイズが変更されているかどうかを確認し、サイズの変化が検出されたときにのみ新しい配列を作成すると、上のようにうまく動作します。一方、マップが頻繁に変更される場合は、アクセスごとに配列を再作成して、パフォーマンスの低いデータ構造を作成する必要があります。

+0

'toArrayすべての点を無意味にするコレクション全体をスキャンします。 @SuzanCioc確かに –

+0

。だからこそ私が答えているのは、マップが頻繁に変更されずに配列をキャッシュすることができる場合にのみ意味があります。 –

2

お試しくださいLinkedHashSet、と思います。

+0

これは、インデックスを持つ要素にアクセスする方法の問題を解決しません。 –

1

使用リンクハッシュマップ。これにより、キーを使用して要素を取得できます。また、要素と同じ順序で要素を取得することもできます。

1

私はあなたがドキュメントからLinkedHashMap

を探していると思う:

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

関連する問題