2010-06-22 2 views
9

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

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

+0

С какой стороны вам нужно быть картой? Собираетесь ли вы с карты на объект, объект на карту или на карту? – MikeD

+0

Не можете ли вы просто сделать карту ? Или вы хотите сделать что-то вроде map.put (key1, key2, value)? – Dave

+0

Не думаю, что это слишком актуально, но мне любопытно: какая компания/индустрия (как вам было удобно говорить) все еще требует Java 1.4? Даже Java 5 уже давно переполнена. Java 1.4 был EOLd уже почти 2 года. –

ответ

7

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

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

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

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

чем

school.get ("John Doe").get ("Math") 
4

регулярного сбора карт работает для этого:

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); 

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

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

Как правило, никто не хочет иметь заботиться о том, находится ли данный (первый) ключ в 'mapOfMaps', например при выполнении 'mapOfMaps.get (" firstKey "). put (" secondKey ", value)'. Например, карты Python имеют метод ['setdefault'] (http://docs.python.org/2/library/stdtypes.html#dict.setdefault) для этой цели. –

1

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

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

Смежные вопросы