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