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

时间:2013-08-28 12:18:27

标签: java hashtable

我正在尝试通过检查顶点的唯一性来修剪3D网格。但是因为每个顶点都有一些与之相关的错误,所以两个“相似”的顶点实际上可能是相同的。 e.g。

< 1.9999999,1,3>可以是与< 2.000001,1,3>

相同的顶点

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

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

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

我考虑量化空间,即将整个地面的地板放到一些小数位。但是,在我上面的例子中,我将转向&lt; 1.999,1,3&gt;和&lt; 2.000,1,3&gt;例如。

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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


作为必然结果,您的equals()方法也存在缺陷。 contract for equals()要求传递,即a.equals(b)b.equals(c),然后a.equals(c)任何 { {1}},ab。你的定义并非如此。

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