2017-02-17 13 views
4

У меня есть требование, когда мне нужно сопоставить набор конфигураций с набором значений, в идеале обозначаемых структурой Map<Map<String, Object>, Map<String, Object>>.Использование HashMap в качестве ключа для другого HashMap

В обеих конфигурациях & значениями основной карты являются произвольные &, поэтому я не могу использовать конкретный класс.

Просьба сообщить об этой структуре. Может ли Карта использоваться в качестве ключа для другой Карты. Проведя немного исследований, я смог установить, что метод равных карт использует все базовые ключи. & Ценности, чтобы считать два Карты равными. Кроме того, HashCode карты основан на хэш-кодах ключей карты. Эта ИМО должна удовлетворять минимальным требованиям использования Карты в качестве ключа.

Мне бы хотелось, чтобы кто-то подтвердил это, прежде чем я продолжу реализацию. Если есть лучшее решение/дизайн, который может предложить кто-то, пожалуйста, не стесняйтесь.

EDIT

Я закончил с использованием простой тильды ('~') & трубы ('|'), разделенных строки в качестве ключа & деконструкции его всякий раз, когда это необходимо. Спасибо всем, кто помог.

+6

У вас нет этого требования. Вы только думаете, что делаете. – Raedwald

+0

Возможно, вы каким-то образом взломали его, но я думаю, вы должны отступить и быть на 100% уверенным, что не можете использовать String или Pojo в качестве ключа. –

+2

Составление карт карт - это ключ к созданию отдельных классов. –

ответ

16

Да, HashMapможет использоваться в качестве ключа к другой карте, как класс правильно переопределяет .equals() и .hashCode().

Однако это в широком смысле bad idea to use mutable types (например, HashMap) в качестве Map ключей или Set элементов, потому что вы нарушаете инварианты этих классов ожидать, если объекты мутируют в коллекции.

Хотя не совсем то, что вы ищете, Guava предлагает несколько additional data structures, таких как Multiset, MultiMap, BiMap, Table, которые могут быть полезны. Они также предлагают immutable collections, такие как ImmutableMap, которые (потому что они не могут быть мутированы) безопаснее использовать в качестве ключа Map. Что не означает, что вы должны сделать это, просто чтобы это было безопасно (если ключи и значения также неизменяемы).

Рассмотрите возможность отправки по электронной почте вопрос о том, что вам нужно, чтобы завершить работу над созданием структуры Map<Map<K, V>, Map<K, V>>. Вы можете получить ответы на вопросы , что вопрос.

+0

Это очень важно. Я полностью забыл о неизменности. Посмотрите на непреложные коллекции. – Sumit

+0

@Sumit, рад помочь, но, пожалуйста, также рассмотрите альтернативные структуры данных. Вложенные карты обычно являются запахом кода и могут быстро стать трудными для работы с. – dimo414