2015-10-07 77 views
3

我有一個HashMap(String,Object)。關鍵是多個唯一ID的組合。我有一個輸入,一個字符串是鍵的一部分(1個唯一的ID)。我需要使用HashMap中的值,而不使用HashMap中的數千個值。在HashMap.get使用任何正則表達式語句使用部分密鑰獲取HashMap的值

才能實現它()?

我的重點是XXX.YYY.ZZZ其中xxx.zzz的組合在整個地圖是唯一的。我有xxx和zzz作爲輸入。對於一個給定的zzz,我還有一組可能的yyy值(5-6種可能性會增加)。

我現在有兩個選擇來解決這個問題。

  1. Map.Entry的檢查是否鑰匙啓動,並與xxx和ZZZ分別爲
  2. 試錯法 我結束。使用所有可能的yyys形式鍵xxx.yyy.zzz並使用.contains() ii。檢查密鑰是否存在。但是,這樣,如果我爲每個調用執行.contains()5-6次,在最壞的情況下是不是會循環5-6次? iii。另外我在stringpool中創建更多的字符串。

哪一個,我應該更喜歡哪個?

+0

HashMap不能用於檢索密鑰部分。您需要完全匹配查找。 – Thilo

+0

誰在這裏壓倒了所有的答案?不要拍攝使者。 HashMap只是沒有做到這一點... – Thilo

+0

你的數據集有多大,你需要多長時間查詢一次?通過「數千」鍵的線性搜索可能並不太可怕。 「數十萬」可能會讓你陷入困境。 – Thilo

回答

0

我們可以使用HashMap.get()中的任何正則表達式來實現它嗎?

不可以。您需要傳遞確切的關鍵值才能獲得關聯的值。

另外,您應該itertate奧伯鍵和得到匹配它的值。他們你可以有正則表達式來匹配你的輸入字符串和鍵。

3

只需要從HashMap中檢索值而不迭代條目/鍵(您不想要的)的唯一方法就是搜索完整鍵。

如果您需要通過部分密鑰有效的搜索,你應該考慮有HashMap,其關鍵是局部關鍵。

+0

雖然這將是一個多地圖。或者可能是一個嵌套的Map(Map >' – Thilo

+0

@Thilo)或者是一個單獨的部分關鍵映射圖,或者是包含同一個值的多個關鍵字(全部和部分關鍵字)的相同映射。 – Eran

+0

我提出了2個解決方案。你能幫我找到更好的嗎? –

3

不,不可能使用部分密鑰與HashMap

使用TreeMap這可以用所需密鑰的部分前綴來實現,因爲它允許您使用tailMap(String key)返回將遵循特定密鑰(即您的關鍵部分)的地圖的一部分。您仍然需要處理條目以查看哪些條目與部分密鑰匹配。

+0

TreeMap是前綴搜索的好選擇(仍然不適用於任意模式)。 – Thilo

+0

@Thilo啊你是對的,他有一個ID1 | ID2 | ID3關鍵... – Kayaman

+0

的類型。如果他這樣做,他需要像Lucene的關鍵詞索引。 – Thilo

0

不能使用HashMap做到這一點。然而,你可以使用一個TreeMap這將內部存儲密鑰根據其自然順序。你可以編寫一個自定義搜索方法,它將使用正則表達式找到匹配關鍵字(如果存在的話)。如果寫入正確,這將需要O(lgN)時間,這比線性要好得多。問題歸結爲在String的有序列表中搜索String

正如@Thilo指出的那樣,這個解決方案假定你正在試圖匹配一個開頭的密鑰片段,而不是其他地方。

+1

..如果你想要前綴搜索,是的。如果您的按鍵結構像「id1,id2,id3」(只有一個鍵),並且希望全部使用「id2」,則不起作用。 – Thilo

1

如果您的鑰匙與xxx.yyy.zzz類似,並且您想使用xxx.*類型的存取,那麼您可以考慮我的MapFilter類。

它允許您採取Map並在某個關鍵字前綴上對其進行過濾。這將會搜索特定的前綴並在稍後保留該搜索的結果。

0

HashMap適用於散列算法,該算法維護密鑰散列碼的散列桶並根據該散列碼散列圖檢索對應的值。對於您需要覆蓋equals()hashcode()自定義對象的方法。

所以

  1. 如果你會嘗試得到一個鍵的值,那麼關鍵的哈希碼值獲取生成,並進一步獲取基於該散列碼操作發生。

  2. 如果你不會給出關鍵字的精確匹配,HashMap將如何找出具有錯誤散列碼的存儲桶?