Java 如何使用equals()和hashCode()实现近似几何等式

Java 如何使用equals()和hashCode()实现近似几何等式,java,hash,geometry,hashcode,equality,Java,Hash,Geometry,Hashcode,Equality,我想实现一些具有数值稳健性的几何算法 为此,系统范围的增量用于几何相等equals()通过使用近似相等的delta进行距离计算来实现 我希望能够使用常规java集合,例如Set。但是我不能想出一个合理的hashCode()实现 我的猜测是,一个高效HashSet使用的实现将导致一个带有“软”边界的空间分区。距离分区边界小于delta的点应能够同时在多达八个(对于3D)相邻区域中进行分类。距离足够近的点就其距离而言是相等的,但位于分区的不同侧面,否则将被“错误分类” 这是我无法理解的hashCod

我想实现一些具有数值稳健性的几何算法

为此,系统范围的增量用于几何相等<点的code>equals()通过使用近似相等的
delta
进行距离计算来实现

我希望能够使用常规java集合,例如
Set
。但是我不能想出一个合理的
hashCode()
实现

我的猜测是,一个高效
HashSet
使用的实现将导致一个带有“软”边界的空间分区。距离分区边界小于delta的点应能够同时在多达八个(对于3D)相邻区域中进行分类。距离足够近的点就其距离而言是相等的,但位于分区的不同侧面,否则将被“错误分类”

这是我无法理解的
hashCode()
就像是将项目放入一个桶中,而一个项目最终会放入一个桶中,而我需要将其放入最多八个桶中

什么是合理的解决方案?我是否滥用了
hashCode()
的目的?使用
hashCode()
:)最合理的解决方案是什么

编辑:谢谢你,我直觉认为这个想法有问题,但我无法确定。你把事情说得很清楚

请允许我将我的问题扩展到:如果我对较慢的
HashSet
操作(这不是一个showtupper)没有问题,我可以使用
hashCode()
返回
1
,因为在我的情况下没有正确的实现,如果我实现
equals()
是否放弃传递性要求


编辑我发现,突出了缺少及物性和and的问题,这与此密切相关。

这根本不可能

equals()
/
hashCode()
基于等式的等式只能在遵循三条规则的数学模型上定义:

  • a~a。(自反性)
  • 如果a~b,那么b~a。(对称性)
  • 如果a~b和b~c,那么a~c。(及物性)
您的定义不可传递,因此无法使用它。
相反,您需要一个备用数据结构。

hashCode()
对于un-
equals()
对象可以是相等的。所以,事实上,扣扣可能还不错。例如,如果您只使用最近“网格”点的某个哈希函数,您可以根据需要定义该网格,只要您一致且正确地定义舍入,它将作为哈希函数工作

但是,您无法从第一个定义中获得正确的
equals()
概念。如果A和B以及B和C彼此在增量范围内,这并不意味着A和C在增量范围内。及物性不成立


您可以根据bucketing定义
equals()
。它可能会给出稍微令人惊讶的结果,因为点接近,但线的另一边不相等。

我建议不要使用这种方法。首先,它将破坏
equals
的传递属性。(如果delta==0.1,那么1==1.1和1.1==1.2,但是1!=1.2。)没有任何哈希代码实现可以解决这个问题。一般来说,它也可能会把集合框架搞得一团糟