Любая реализация Map <K1, K2, V>, то есть два ключа? - PullRequest
6 голосов
/ 22 ноября 2008

Мне нужна карта с двумя ключами, например,

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

Так что я могу

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

и позже

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

Или даже

_employees.remove1(someImpId);

Я не уверен, почему я хочу остановиться на двух, а то и больше, возможно, потому что это тот случай, который мне нужен сейчас :-) Но тип должен обрабатывать фиксированное количество ключей, чтобы быть безопасным для типа - Параметры типа не могут быть vararg: -)

Цените любые указания или советы о том, почему это плохая идея.

Ответы [ 3 ]

4 голосов
/ 22 ноября 2008

Я полагаю, что main key будет empId, поэтому я бы построил Map с этим ключом, т.е. empId ---> Employee. Все другие уникальные атрибуты (например, ssn) будут обрабатываться как вторичные и будут использовать отдельные Map s в качестве таблицы поиска для empId (например, ssn ---> empId) .

Эта реализация позволяет легко добавлять / удалять сотрудников, поскольку вам нужно всего лишь изменить один Map, т.е. empId ---> Employee; другие Map могут быть восстановлены только при необходимости.

4 голосов
/ 22 ноября 2008

Моей первой мыслью было: самый простой способ сделать это, я думаю, это две карты.

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

Но, судя по всему, вы просто хотите найти сотрудника по SSN или ID. Что может помешать вам создать две карты или, в худшем случае, класс, содержащий две карты?

В качестве пояснения, ищете ли вы составной ключ , поскольку сотрудники однозначно идентифицируются по комбинации их SSN и ID, но не по отдельности, или вы ищете два различных способа ссылка на сотрудника?

2 голосов
/ 22 ноября 2008

Spiffy Framework , кажется, обеспечивает именно то, что вы ищете. Из Javadocs:

Двумерная хэш-карта, это HashMap, который позволяет вам ссылаться на значения через две клавиши вместо одной

Соответствующий класс TwoDHashMap . Он также предоставляет ThreeDHashMap .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...