2008-11-22 7 views
6

Necesito un mapa que tenga dos claves, p.Cualquier implementación de Map <K1, K2, V>, es decir, dos claves?

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

para que pueda

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

Y más tarde

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

O incluso

_employees.remove1(someImpId); 

No estoy seguro de por qué quiero parar en dos, por qué no más, probablemente porque ese es el caso que necesito ahora mismo :-) Pero el tipo necesita manejar un número fijo de claves para ser seguro - los parámetros de tipo no pueden ser vararg :-)

Apreciar cualquier sugerencia o consejo sobre por qué es una mala idea.

+0

Algo así como Boost :: MultiIndex (http://www.boost.org/doc/libs/1_37_0/libs/multi_index/doc/index.html), pero para Java. – dalle

Respuesta

4

Mi primer pensamiento fue: la forma más fácil de hacer esto, creo, serían dos mapas.

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

Pero por lo que parece, solo desea poder buscar a un empleado por SSN o ID. ¿Qué le impide hacer dos mapas o, en el peor, una clase que contiene dos mapas?

Como aclaración, está buscando una clave compuesto siendo empleados se identifican de forma única por la combinación de su número de seguro social y una identificación, pero no cualquiera de ellos por sí mismo, o está buscando dos maneras diferentes de hacer referencia a un empleado ?

+0

No, no es una clave compuesta, sino dos claves diferentes. Dos mapas es exactamente lo que estoy haciendo en este momento. Ya en dos clases diferentes.Cuando lo necesitaba en una tercera clase, decidí escribir una clase de Map2, pero quería verificar primero si ya existía. –

4

me imagino que la principal clave empId sería, por lo que sería construir una Map con eso como la clave, es decir, empId --->Employee. Todos los demás atributos únicos (por ejemplo, ssn) se tratarán como secundarios y se usarán Map como una tabla de búsqueda para empId (por ejemplo, ssn --->empId).

Esta implementación facilita la adición/eliminación de empleados, ya que solo necesita cambiar un Map, es decir, empId --->Employee; los otros Map s se pueden reconstruir solo cuando sea necesario.

+0

Interesante. Permite la eliminación de cualquier clave, incluso si hay muchas. Podría ayudarme a resolver los problemas que enfrento con el enfoque de @krosenvold. –

2

El Spiffy Framework parece proporcionar exactamente lo que está buscando. Desde el Javadocs:

un HashMap de dos dimensiones, es un HashMap que le permite hacer referencia a valores a través de dos teclas en lugar de uno

la clase correspondiente se TwoDHashMap. También proporciona un ThreeDHashMap.

+1

El x-DHashMap parece un Mapa con una clave x-dimensional única pero compuesta ... no puede usar cada clave de forma independiente para acceder a los valores. –

Cuestiones relacionadas