Java Map的任何实施<;K1、K2、V>;,i、 两把钥匙?

Java Map的任何实施<;K1、K2、V>;,i、 两把钥匙?,java,generics,maps,Java,Generics,Maps,我需要一张有两把钥匙的地图 Map2<String /*ssn*/, String /*empId*/, Employee> _employees; 后来 _employees.get1(someSsn); _employees.get2(someImpId); 甚至 _employees.remove1(someImpId); 我不确定为什么我想停在2,为什么不停在2,可能是因为我现在需要的就是这种情况:-),但是类型需要处理固定数量的键才能确保类型安全--类型参数不能是va

我需要一张有两把钥匙的地图

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

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

_employees.remove1(someImpId);
我不确定为什么我想停在2,为什么不停在2,可能是因为我现在需要的就是这种情况:-),但是类型需要处理固定数量的键才能确保类型安全--类型参数不能是vararg:-)


感谢任何关于为什么这是一个坏主意的指点或建议。

我的第一个想法是:我认为最简单的方法是两张地图

Map< String, Map< String,Employee> > _employees;
Map\u员工;
但从外观上看,您只希望能够通过SSN或ID查找员工。那么,什么能阻止您创建两个映射,或者最坏情况下,阻止您创建包含两个映射的类

作为澄清,您是在寻找一个复合键,因为员工是通过其SSN和ID的组合唯一标识的,而不是单独标识的,还是在寻找引用员工的两种不同方式?

我想主键应该是
empId
,因此,我将以它为键构建一个
Map
,即
empId
-->
Employee
。所有其他唯一属性(例如
ssn
)将被视为次要属性,并将使用单独的
Map
s作为
empId
的查找表(例如
ssn
-->
empId

此实现使添加/删除员工变得很容易,因为您只需要更改一个
Map
,即
empId
-->
Employee
;其他的
地图
只能在需要时重建。

地图似乎正好提供了您想要的东西。从Javadocs:

二维哈希映射,是一个 使您能够引用 值通过两个键而不是一个键


相关类为。它还提供了一个。

不,它不是复合键,而是两个不同的键。两张地图正是我现在正在做的。已经在两个不同的班级了。当我在第三个类中需要它时,我决定编写一个Map2类,但想首先检查是否已经存在一个。它允许从任何键删除,即使有很多键。它可能会帮助我解决@krosenvold方法所面临的问题。类似于Boost::MultiIndex(),但对于Java来说。x-DHashMap似乎是一个带有单一但复合x维键的映射。。。不能单独使用每个键来访问值。
Map< String, Map< String,Employee> > _employees;