2012-01-16 6 views
6

Bir Haritaya ihtiyacım var ama aradığımda (anahtar, n), sadece tüm anahtarların aranan anahtar değeriyle değil, aynı zamanda anahtarın son önemli bitlerinin arama anahtarıyla aynı olduğu tüm kayıtları da döndürmesi gerekir. (ör. & anahtar gibi bir şey uygulayarak (1 < < (n + 1) -1)).Java dünyasında bir değişken anahtar uzunluğuna sahip bir Harita var mı?

Daha önce Java'da uygulanan böyle bir şey var mı?

+0

Neden sadece gerçek anahtarı hesaplanmış anahtarın en az önemli bitlerini oluşturmuyorsunuz? –

+0

@GregS: OP'nin sorgusuna göre, sinekte verilmesini istediğine inanıyorum. – amit

+0

Açıkça belli bir şey standart kütüphanede mevcut değildir. Soru şu: N son önemli bitleri anahtar olarak ve değer olarak bir liste olarak kullanamaz mısınız? Neden kullanamayacağınız bir anahtar belirtin? – Viruzzo

cevap

10

Tam olarak değil, bunu uygulamak için NavigableMap.subMap kullanabilirsiniz. Örneğin.

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

İsterseniz

düşük bit yerine yüksek bit göre arama için, ekleme ve aramadan önce bitleri ters gerekiyor. Bu, en düşük biti, ikinci en düşük biti, sonra üçüncü en düşük biti vb. Birlikte gruplayacaktır.

+1

Anahtarın bitlerini tersine çevirmeniz gerektiğini düşünüyorum çünkü OP en az anlamlı olanı değil, en anlamlı bitleri tutmak ister. – dasblinkenlight

+0

Evet, @dasblinkenlight. Yukarıdaki kod, "n" * en sağdaki * bit yerine aynı '(64 - (n - 1))' * en soldaki * bitleri içeren tuşları kabul ediyor gibi görünüyor. – toto2

+0

İlk önce en düşük bitle nasıl sıralanacağına dair bir yorum eklediniz. –

2

HashMap bunu yapmayacaktır, ancak bir TreeMap yapabilir.

Anahtarlarınızı normalleştirmeniz ve tersine çevirmeniz (yani kaç tane bit tutmak istediğinize karar vermeniz ve en önemsiz bitlerin en önemlisiniz olması için bitleri tersine çevirmeniz gerekir). Daha sonra, daha az önemli bitleri (daha önce en önemli bitleri) anahtarlarınızdan kesebilir ve cevabınızı bulmak için ağaç haritasının aralık aramalarını kullanabilirsiniz.