2012-06-23 8 views
-1

Я пытаюсь использовать Array в качестве ключей в HashMap. Массивы имеют длину 2, поэтому они по существу действуют как 2-кортеж. Внедрение пользовательского 2-кортового класса - последнее средство. Проблема в том, что я хочу, чтобы массивы с одной и той же картографией содержимого находились в другом месте в HashMap, если у них разные места памяти. Я знаю, что есть функции hashCode в Arrays.hashCode и Arrays.deepHashCode, но есть ли способ использовать их для HashMap. Как я уже сказал, я действительно не хочу реализовывать свой собственный класс кортежей.Использование массива в качестве ключа hashmap

+0

Я столкнулся примерно с той же проблемой некоторое время назад и сдался. Я не думаю, что вы можете изменить поведение хэширования примитивного массива. Предоставляя это, у вас есть блестящий случай для введения нового класса SerializableTuple. – Gene

ответ

0

Хорошо, я нашел решение. Вместо использования массива я вместо этого использовал List. Это работает, потому что List определяет равенство по содержанию, а не по ссылке.

3

Я бы не рекомендую этот подход.

Ключи должны быть неизменными. Если вы не создадите свой массив, это будет сопряжено с опасностью.

Java - объектно-ориентированный язык. Я думаю, что ошибочно думать слишком много о примитивах. Инкапсулируйте правильное поведение, которое вам нужно в объектах.

Почему ваш собственный класс настолько угнетает? Крайнее средство? Я не понимаю, почему это так много. Создайте его, сделайте его неизменным, четко запишите свое намерение и двигайтесь дальше.

Обновление: Я бы не стал допускать, что у вас уже есть неправильный класс, не позволяющий вам делать правильные вещи в этом случае. Вы говорите, что у вас есть «сотни классов» - я говорю, что делать правильные вещи с еще одним не сломает вас. Код заканчивается в руинах путем накопления «практических», плохих решений, подобных тому, который вы собираетесь сделать. Решите, чтобы не добавить к трещине, создав правильное решение для этой узкой проблемы и начать отработать оттуда, чтобы лучше ответить.

+0

У нас уже есть реализация кортежа, но она не может быть сериализована нашим сериализатором, и мне нужна эта информация для сериализации. Я не собираюсь дублировать функциональность, а реализация нашего кортежа является одной из основных структур данных нашего проекта, которая охватывает сотни классов. – Max

+0

Правильное решение здесь - сосать его и написать новый класс 'Pair' или, что еще лучше, написать класс с более конкретным именем и конкретными именами полей. Массивы никогда не должны использоваться, когда разные элементы имеют разные значения. Даже если бы здесь был какой-то способ использовать «Arrays.equals» или «Arrays.hashCode» здесь, которого нет - писать новый класс было бы недвусмысленно правильным решением здесь. –

+1

@Max - простое решение - изменить существующий (неизменный) тип кортежа, чтобы сделать его сериализуемым. Что это за риск? Создание сериализуемого класса кортежа не может нарушить существующий код, который не пытается сериализовать кортежи ... –

1

Проблема в том, что я хочу, чтобы массивы с одинаковой конфигурацией содержимого отображались в другом месте в HashMap, если у них разные места памяти.

Если массивов имеют различные ячейки памяти, или если содержимого массивов в разных местах памяти? Если это первый, вы можете использовать IdentityHashMap вместо обычного HashMap. Если это последнее, однако, я полностью согласен с ответом @ duffymo: grow a pair;)

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