Структура данных карты Карт - PullRequest
9 голосов
/ 22 июня 2010

Класс MultiValueMap (общие коллекции Apache) упрощает работу с картой, значения которой являются коллекциями. Я ищу класс, который облегчает работу с картой, ключи которой являются объектами, а значения - картами.

Я использую Java 1.4, поэтому не могу использовать Google Collections или generics.

Ответы [ 3 ]

8 голосов
/ 22 июня 2010

Карта карт на самом деле представляет собой древовидную структуру без единого корневого узла (как и карта карт с картами ...).

Вы можете посмотреть Составной шаблон , которыйшироко используется для реализации древовидных структур (если их компоненты имеют один и тот же тип, что не так, как я чувствую).

Другое решение заключается в реализации простой модели предметной области.Это будет намного понятнее и легче поддерживать что-то вроде:

school.getPupil ("John Doe").getMark ("Math")

чем

school.get ("John Doe").get ("Math")
4 голосов
/ 22 июня 2010

Обычная коллекция Map работает для этого:

    Map<Object,Map<Object,Object>> mapOfMaps = new LinkedHashMap<Object,Map<Object,Object>>();
    Object newObject = new String("object as string");
    mapOfMaps.put(newObject, new LinkedHashMap<Object,Object>());
    Map<Object,Object> objectMap = mapOfMaps.get(newObject);

На самом деле, если вы не беспокоитесь о безопасности типов, вы можете поместить в секцию значений все, что вы хотите:

1 голос
/ 22 июня 2010

Если у вас есть map:{string,map:{string,thing}} (намеренно , а не , использующий синтаксис Java, чтобы избежать всего бизнеса Java1.4 / Java5), вам также следует подумать о том, стоит ли вместо этого моделировать его как map:{tuple:{string,string},thing},Если преобладают многоуровневые поиски, то это хорошее изменение, которое нужно сделать (при условии, что вы реализуете хороший tuple, который правильно выполняет equals() и hashCode()), но если вы выполняете много операций вставки и удаления, тогда это менее полезно.

Интеллект в hashCode, вероятно, означает просто придумать разумный способ смешать биты из hashCodes содержимого вместе.Если ожидается, что значения членов будут из непересекающихся наборов (например, имен и профессий), тогда вы можете просто XOR их вместе - несовершенные, но дешевые и быстрые - но если у вас меньше контроля / уверенности, то вам нужно сделать что-то еще, какхорошо (например, поверните биты одного из значений до XOR).

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