Я хотел бы реализовать некоторые геометрические алгоритмы с числовой устойчивостью.
Для этого используется общесистемное delta
для геометрического равенства. equals()
для точек реализуется с помощью вычисления расстояния с использованием delta
для приблизительного равенства.
Я бы хотел использовать обычные java-коллекции, например, Set
. Но я не могу придумать разумную реализацию hashCode()
.
Я предполагаю, что реализация для эффективного использования HashSet
приведет к разделению пространства с "мягкими" границами. Точки с расстоянием менее delta
до границы раздела должны быть в состоянии классифицироваться в восьми (для 3D) смежных областях одновременно. Точки, достаточно близкие для того, чтобы считаться равными с точки зрения их расстояния, но лежащие по разные стороны перегородки, в противном случае были бы «неправильно классифицированы».
Это то, чего я не могу понять. hashCode()
- это все равно, что складывать предметы в ведра с одним предметом, заканчивающимся в одном ведре, в то время как мне нужно было бы поместить их до восьми.
Каким было бы разумное решение? Я злоупотребляю целью hashCode()
? И что было бы наиболее разумным решением при использовании hashCode()
:)
РЕДАКТИРОВАТЬ: Спасибо, у меня была интуиция, что с этой идеей было что-то не так, но я не мог понять, что с ней. Вы сделали это очень ясно
Пожалуйста, позвольте мне расширить мой вопрос: если я в порядке с более медленной операцией HashSet
(которая не является showtopper), я мог бы получить hashCode()
return 1
, поскольку в моем случае нет правильной реализации, какие бы ужасные последствия были (это условия геометрических вычислений), если бы я реализовал equals()
, отбросив требование транзитивности?
РЕДАКТИРОВАТЬ Я нашел этот пост , освещающий проблемы с отсутствующей транзитивностью и и этот пост , который тесно связан с этим.