2008-11-22 61 views
6

我需要一張有兩個鍵的地圖,例如Map <K1, K2, V>的任何實現,即兩個密鑰?

Map2<String /*ssn*/, String /*empId*/, Employee> _employees; 

,這樣我可以

_employees.put(e.ssn(), e.empId(), e) 

後來

_employees.get1(someSsn); 
_employees.get2(someImpId); 

甚至

_employees.remove1(someImpId); 

我不知道爲什麼我要停止兩個,爲什麼不更多,可能是因爲這是我現在需要的情況:-)但類型需要處理固定數量的鍵是類型安全的 - 類型參數不能是可變參數:-)

欣賞任何指針或建議爲什麼這是一個壞主意。

+0

類似Boost :: MultiIndex(http://www.boost.org/doc/libs/1_37_0/libs/multi_index/doc/index.html),但對於Java。 – dalle 2008-11-22 18:23:43

回答

4

我的第一個想法是:我認爲最簡單的方法是使用兩張地圖。

Map< String, Map< String,Employee> > _employees; 

但是從它看起來,您只希望能夠通過SSN或ID查找員工。那麼,製作兩張地圖,或者最糟糕的是一個包含兩張地圖的課程會阻止你?

作爲一個澄清,你在找一個複合鍵是員工由其唯一SSN和ID的組合來標識,而不是兩者本身,或者是你尋找引用僱員的兩種不同的方法?

+0

不,它不是一個複合鍵,而是兩個不同的鍵。 兩張地圖正是我現在正在做的。已經在兩個不同的類。當我需要第三堂課時,我決定編寫一個Map2課程,但是想先檢查一下它是否已經存在。 – 2008-11-22 11:01:56

4

我想象鍵將empId,所以將建立與作爲密鑰的Map,即empId --->Employee。所有其他獨特屬性(例如ssn)將被視爲第二並將使用單獨的Map作爲empId的查找表(例如,ssn --->empId)。

由於您只需更改一個Map,即empId --->Employee;因此您可以輕鬆地添加/刪除員工。其他Map只能在需要時重建。

+0

有趣。它允許從任何鍵刪除,即使有很多。它可以幫助我用@krosenvold方法解決我面臨的問題。 – 2008-11-22 12:23:42

2

Spiffy Framework似乎提供了你正在尋找的東西。從的Javadoc:

二維HashMap的,是一個 HashMap的,使您能夠通過兩個鍵是指 值,而不是一個

相關類是TwoDHashMap。它還提供了一個ThreeDHashMap

+1

x-DHashMap看起來像是一個具有單個複合x維關鍵的Map ...您無法獨立使用每個關鍵字來訪問這些值。 – 2008-11-22 18:58:03