Я пытаюсь использовать Array в качестве ключей в HashMap. Массивы имеют длину 2, поэтому они по существу действуют как 2-кортеж. Внедрение пользовательского 2-кортового класса - последнее средство. Проблема в том, что я хочу, чтобы массивы с одной и той же картографией содержимого находились в другом месте в HashMap, если у них разные места памяти. Я знаю, что есть функции hashCode в Arrays.hashCode и Arrays.deepHashCode, но есть ли способ использовать их для HashMap. Как я уже сказал, я действительно не хочу реализовывать свой собственный класс кортежей.Использование массива в качестве ключа hashmap
ответ
Хорошо, я нашел решение. Вместо использования массива я вместо этого использовал List. Это работает, потому что List определяет равенство по содержанию, а не по ссылке.
Я бы не рекомендую этот подход.
Ключи должны быть неизменными. Если вы не создадите свой массив, это будет сопряжено с опасностью.
Java - объектно-ориентированный язык. Я думаю, что ошибочно думать слишком много о примитивах. Инкапсулируйте правильное поведение, которое вам нужно в объектах.
Почему ваш собственный класс настолько угнетает? Крайнее средство? Я не понимаю, почему это так много. Создайте его, сделайте его неизменным, четко запишите свое намерение и двигайтесь дальше.
Обновление: Я бы не стал допускать, что у вас уже есть неправильный класс, не позволяющий вам делать правильные вещи в этом случае. Вы говорите, что у вас есть «сотни классов» - я говорю, что делать правильные вещи с еще одним не сломает вас. Код заканчивается в руинах путем накопления «практических», плохих решений, подобных тому, который вы собираетесь сделать. Решите, чтобы не добавить к трещине, создав правильное решение для этой узкой проблемы и начать отработать оттуда, чтобы лучше ответить.
У нас уже есть реализация кортежа, но она не может быть сериализована нашим сериализатором, и мне нужна эта информация для сериализации. Я не собираюсь дублировать функциональность, а реализация нашего кортежа является одной из основных структур данных нашего проекта, которая охватывает сотни классов. – Max
Правильное решение здесь - сосать его и написать новый класс 'Pair' или, что еще лучше, написать класс с более конкретным именем и конкретными именами полей. Массивы никогда не должны использоваться, когда разные элементы имеют разные значения. Даже если бы здесь был какой-то способ использовать «Arrays.equals» или «Arrays.hashCode» здесь, которого нет - писать новый класс было бы недвусмысленно правильным решением здесь. –
@Max - простое решение - изменить существующий (неизменный) тип кортежа, чтобы сделать его сериализуемым. Что это за риск? Создание сериализуемого класса кортежа не может нарушить существующий код, который не пытается сериализовать кортежи ... –
Проблема в том, что я хочу, чтобы массивы с одинаковой конфигурацией содержимого отображались в другом месте в HashMap, если у них разные места памяти.
Если массивов имеют различные ячейки памяти, или если содержимого массивов в разных местах памяти? Если это первый, вы можете использовать IdentityHashMap
вместо обычного HashMap
. Если это последнее, однако, я полностью согласен с ответом @ duffymo: grow a pair;)
- 1. Использование hashmap с объектом в качестве ключа
- 2. Использование байтового массива в качестве словарного ключа
- 3. Использование массива символов в качестве ключа Hashtable
- 4. Использование двух (или более) объектов в качестве ключа HashMap
- 5. Java - Использование HashMap со списком <> в качестве ключа
- 6. Использование ThreadLocal против HashMap с потоком в качестве ключа
- 7. Класс KeyStroke в качестве ключа в HashMap
- 8. Использование массива в качестве хеш-ключа в Java?
- 9. Bash hashmap, используя цитату в качестве ключа
- 10. Java: использование подстановочного знака (*) для ключа HashMap
- 11. Поиск ключа в hashmap
- 12. Использование массива переменной длины в качестве ключа карты в golang
- 13. Использование 3d-массива в качестве ключа для карты в C++?
- 14. Использование «userData.uid» в качестве ключа
- 15. Использование пары значений в качестве ключа
- 16. Использование Hashmap содержит метод проверки дублирующего ключа
- 17. JAXB, использовать атрибут XML в качестве ключа в HashMap
- 18. Почему не работает ArrayList в качестве ключа в HashMap?
- 19. ключа в HashMap Получить с диапазоном чисел в качестве значения
- 20. Можно ли использовать StringBuffer в качестве ключа в HashMap?
- 21. ключа в HashMap Java
- 22. Использование байтового массива в виде ключа карты
- 23. Использовать свойство объекта в качестве ключа массива
- 24. класса константа в качестве ключа массива
- 25. Использование звездочки * в качестве ключа в объекте
- 26. Использование строк в качестве ключа в IdentityHashMap
- 27. Использование указателя в качестве ключа в словаре
- 28. Использование кортежа в качестве ключа в scala
- 29. Использование строки * в качестве ключа в unordered_set
- 30. Использование словаря в качестве ключа в словаре
Я столкнулся примерно с той же проблемой некоторое время назад и сдался. Я не думаю, что вы можете изменить поведение хэширования примитивного массива. Предоставляя это, у вас есть блестящий случай для введения нового класса SerializableTuple. – Gene