2008-11-22 35 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