2012-01-16 10 views
6

私はマップが必要ですが、get(key、n)を呼び出すときには、検索されたキー値を持つすべてのレコードだけでなく、キーのn個の最後の有効ビットが検索キー(例えば、&(1 < <(n + 1)-1)のようなものを適用する)。Javaの世界で可変長のマップがありますか?

すでにJavaで実装されているようなものはありますか?

+0

実際のキーを計算されたキーの最下位ビットだけにするのはなぜですか? –

+0

@GregS:私はOPが質問ごとにオンザフライで与えられると思うと思う。 – amit

+0

明らかに、これほど具体的なものは標準ライブラリでは使用できません。質問は、キーとしてn最後の有効ビットを使用し、値としてリストを使用できないのですか?実際に使用できないキーを指定するのはなぜですか? – Viruzzo

答えて

10

これはあまり意味はありませんが、NavigableMap.subMapを使用して実装できます。例えば

NavigableMap<Integer, Value> map = 
int keyBase = key & ~((1 << n)-1); 
Map<Integer, Value> subMap = map.subMap(keyBase, true, keyBase + (1 << n), false); 

最上位ビットの代わりに最下位ビットに基づいて検索する場合は、追加および検索する前にビットを反転する必要があります。これにより、最下位ビット、2番目に低いビット、3番目に低いビットなどがグループ化されます。

+1

私はあなたがキーのビットを反転する必要があると思います。なぜなら、OPは最も重要ではないビットを保持したいからです。 – dasblinkenlight

+0

はい、@dasblinkenlightです。上のコードは、 'n' *右端*ビットではなく、同じ'(64 - (n - 1)) '*左端*ビットを持つキーを受け入れるようです。 – toto2

+0

最初にソートする方法のコメントを追加しました。 –

2

ハッシュマップはそれを実行しませんが、TreeMapは実行できません。

キーを正規化して元に戻す必要があります(つまり、保持するビット数を決定し、ビットを反転させて、重要度の低いビットを最も重要なものにする必要があります)。次に、重要でないビット(以前は最上位ビット)をキーから削除し、ツリーマップの範囲検索を使用して答えを見つけ出すことができます。

関連する問題