繁体   English   中英

在某些epsilon中检查Java对象的唯一性

[英]Check Uniqueness of a Java Object, within some epsilon

我正在尝试通过检查顶点的唯一性来修剪3D网格。 但是,由于每个顶点都有某种与之相关的错误,因此两个“相似”的顶点实际上可能是相同的。 例如

<1.9999999,1,3>可以是与<2.000001,1,3>相同的顶点

我需要检查数百万个顶点,因此我打算将所有对象放入哈希表并进行查询,以查看它们是否唯一。 覆盖isEqual很容易:取两个坐标之间的差的绝对值,然后除以一个的大小。 例如:

if (Math.abs((x2-x2)/x1) < 0.0000001) return true;

但是,如何提出一个哈希码,对于两个有效相等但不完全相等的顶点,它们将返回相同的值?

我考虑过要量化空间,即将整个集合的底数降低到小数点后一位。 但是,然后在上面的示例中,我将四舍五入为<1.999,1,3>和<2.000,1,3>。

但是,如何提出一个哈希码,对于两个有效相等但不完全相等的顶点,它们将返回相同的值?

简而言之,这是不可能的。

如果所有x hashcode(x) == hashcode(x + eps) ,那么hashcode(x + eps) == hashcode(x + 2*eps)等也是正确的。

满足此要求的唯一方法是int hashcode() { return CONSTANT; } int hashcode() { return CONSTANT; } ,用途有限。


当然, equals()方法也存在缺陷。 equals()合同要求它是可传递的 ,即,对于任何 abc ,如果a.equals(b)b.equals(c) ,则a.equals(c) 您的定义并非如此。

这将导致各种微妙的地狱,因为许多标准Java集合等都依赖于此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM