2015-02-05 87 views
3

正如我們所知,HashMap將所有數據保存在桶中(根據hashCode()計算桶位置)。如何在HashMap中獲取桶中的所有元素

有沒有什麼辦法讓斗的所有元素(不反覆整桶

my hashCode() method generates hashcode like (**bkt1,bkt2,bkt3 and bkt4**) 
in **bkt1** we have values like (**val1,val2,val3 and val4**) 
in **bkt2** we have values like (**val5,val6 and val7**) 
and so on .... 

我能斗的所有值BKT1 不反覆整個地圖

+0

你爲什麼要這樣做?僅僅是爲了調試的目的,還是你有功能的原因來訪問個別桶? – Dolda2000 2015-02-05 14:57:06

+0

我必須保存在HashMap中一些僱用了,我想分類像 2000 $的工資 的基礎 - $ 3000 3001 $ - $ 3500 3501 $ - $ 4000 現在,如果我想使用那些具有之間工資2000 $ - 3000 $我只是選擇第一個桶元素 我不想迭代整個hashMap – user3619843 2015-02-09 06:47:43

+0

我必須承認,我不明白爲什麼你會想要訪問哈希桶。員工是否因工資或其他事情而遭受冷遇?這聽起來像一個'TreeMap'就是你想要的東西,如果有的話。 – Dolda2000 2015-02-09 06:49:37

回答

5

您無法獲取Java HashMap的桶中的所有元素。這是因爲存儲桶是實現HashMap的內部概念,因此不會被HashMap公開。 (沒有公開的處理桶概念的HashMap方法)

爲了完成你正在嘗試做的事情,你需要自己實現桶。這意味着你將需要一個Map<Integer,List<MyElement>>。整數是散列碼,並且List<MyElement>將成爲您的存儲桶。

編輯:

所以,現在,在評論你問的最佳性能。所以,這可能是一項家庭作業,如果沒有首先完全理解hashmaps背後的理論,那麼你試圖完成這項作業。而且有可能你已經完全誤解了這裏的所有情況:作業要求你做什麼,如何解決它,甚至是什麼hashmaps。

如果您對性能有絲毫關切,那麼您應該放棄擔心自己實施存儲桶並繼續使用由語言提供給您的散列表,這很簡單明瞭。只要確保你的對象實現了一個好的散列函數,這意味着一個散列函數可以產生廣泛的分佈。散列函數間接影響將由散列映射內部創建的存儲區數量,並且您希望它儘可能多地創建存儲區,儘可能減少每個存儲區中的元素。廣泛的分佈將做到這一點。

你不會自己操縱桶,也沒有任何觀察它們的方法(除了使用調試器),但hashmap內部將創建多少桶取決於你的哈希函數有多好。

+0

什麼應該是HashMap中的桶號和桶大小。所以,我可以根據這個設計我的hashCode(),就像我必須在地圖上保存500條記錄,所以應該是不。的桶表現得很好 – user3619843 2015-02-06 07:12:24

+0

我不確定你在問什麼,或者如果你問什麼,(我沒有看到任何問號),但是如果你問什麼應該是桶的數量,那麼,hashmaps有概念的負載率,而合理的數字爲75%。這意味着桶的數量應該是地圖中元素數量的75%左右。 – 2015-02-06 08:32:19

+0

關於表現,我修改了我的答案。 – 2015-02-06 08:40:54

0

除了Mike Nakis的回答,如果您的意圖只是通過indexMap獲取對象,請使用接口方法Object get(key)