2012-01-16 32 views
6

我需要一張地圖,但是當我調用get(鍵,N)應該要與搜索到的鍵值返回,不僅所有的記錄,也全部在n個關鍵的最後顯著位是一樣的搜索鍵(例如應用諸如鍵&(1 < <(n + 1)-1))。Java世界中是否存在具有可變密鑰長度的Map?

有沒有這樣的事情在Java中已經實現了?

+0

爲什麼不把實際的密鑰只是計算密鑰的n個最低有效位? – 2012-01-16 14:02:08

+0

@GregS:我相信OP希望每個查詢都可以隨時給予'n'。 – amit 2012-01-16 14:03:08

+0

顯然,標準庫中沒有特定的內容。問題是:你不能只使用n個最後有效位作爲鍵和一個列表作爲值嗎?爲什麼指定一個你實際上無法使用的密鑰? – Viruzzo 2012-01-16 14:03:20

回答

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); 

如果你想搜索基於最低位,而不是最高位,你有添加和搜索之前扭轉位。這將組合在一起的最低價位,第二個最低位,然後第三個最低位等

+1

我認爲你需要反轉密鑰的位,因爲OP希望保留最低有效位,而不是最高有效位。 – dasblinkenlight 2012-01-16 14:09:06

+0

是的,@dasblinkenlight。它看起來像上面的代碼接受具有相同的'(64 - (n - 1))* *最左邊*位而不是'n' *最右邊*位的密鑰。 – toto2 2012-01-16 15:45:49

+0

已添加如何按最低位先排序的評論。 – 2012-01-16 16:13:49

2

的HashMap是不會做,但一個TreeMap可能。

您將需要規範和扭轉你的鑰匙(即決定你想要多少位保持和反向位,使少顯著位成爲您最顯著)。然後,您可以從鍵中去掉較低有效位(以前是最重要的位),並使用樹圖的範圍搜索來查找答案。

相關問題