2015-07-04 3 views
0

У меня есть сопоставление массива int [2] с весами. Итак, [2, 3] -> 5, [4,5] -> 6 и т. Д. Является ли работоспособной стратегией использование HashMap, где я делаю h.put (Arrays.deepHashCode (a), w)? У меня большой объем данных, и я хочу иметь возможность быстро находить весы, заданные координатами x, y. Я вижу ошибки, когда h.get (hashcode), кажется, возвращает мне неожиданные значения позже. Не всегда, но изредка. Возможно, это артефакт того, что [x, y] и [a, b] могут иногда иметь один и тот же deepHashCode()? Я попытаюсь свернуть его до небольшого фрагмента кода, но в настоящее время трудно изолировать эту проблему.Хеширование массива целым числом

EDIT: Я выделил проблему. Выключает Arrays.deepHashCode ([2, 74]) так же, как Arrays.deepHashCode ([3, 43]) [оба возвращают 1097 в мою систему]. Я неправильно подумал, что get() разрешит мне столкновения .. но он не может, поскольку его сопоставление hashcode с значением и ключ массива больше не существует, когда я сделал put().

+1

Да, некоторый код будет очень полезен. Кроме того, что вы подразумеваете под «неожиданными значениями»? Вы, кажется, подразумеваете, что иногда получаете один и тот же хэш-код для двух разных объектов. Это оно? Потому что это не запрещено. – sstan

+0

Я храню тысячи [x, y] кортежей (ключ) для отображения веса (значения) в хеш-таблице. Позже я читаю [x, y], чтобы вернуть вес и его возвращающиеся неожиданные значения (иногда это не то, что я ввел). Вы правы, что мне нужно предоставить более четкий вопрос с кодом. Посмотрите, смогу ли я запустить небольшую программу, чтобы изолировать это. Я полагаю, что [x, y] -> w1 может быть перезаписано [a, b] -> w2, если [x, y] .hashcode и [a, b] .hashcode такие же, но они должны быть редкими. – user3079275

+0

Я согласен с @sstan. Нам нужно увидеть некоторый код, чтобы 1) попытаться понять проблему и 2) попытаться выяснить, почему ваша реализация не работает. –

ответ

2

Вы не должны допускать, чтобы хэш-коды были уникальными. Всегда помните, что return 0 является действительной версией hashCode().

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

+0

Моя проблема в том, что я хочу быстрый поиск веса, заданного кортежем, т. Е. Отображение (x, y) -> w. Как я могу сделать это без hashmaps? – user3079275

+0

Я не говорил, не использую хэш-карты. Я сказал написать пару или тип кортежа для использования в качестве ключа в хэш-карте. –

+0

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

0

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

+0

Я использую deepHashCode(), который должен основываться на содержании – user3079275

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