检查Java对象的唯一性,在一些epsilon中
我试图通过检查顶点的唯一性来修剪3D网格。但由于每个顶点都有某种与之相关的误差,两个“相似”的顶点实际上可能是相同的。e、 g 可以是与相同的顶点 我需要检查数以百万计的顶点,所以我要把所有的对象放到一个哈希表中并进行查询,看看它们是否唯一。覆盖等质量很容易:取两个坐标之间差值的绝对值除以1的大小。例如:检查Java对象的唯一性,在一些epsilon中,java,hashtable,Java,Hashtable,我试图通过检查顶点的唯一性来修剪3D网格。但由于每个顶点都有某种与之相关的误差,两个“相似”的顶点实际上可能是相同的。e、 g 可以是与相同的顶点 我需要检查数以百万计的顶点,所以我要把所有的对象放到一个哈希表中并进行查询,看看它们是否唯一。覆盖等质量很容易:取两个坐标之间差值的绝对值除以1的大小。例如: if(Math.abs((x2-x2)/x1)
if(Math.abs((x2-x2)/x1)<0.0000001)返回true代码>
但是,我怎样才能得到一个哈希代码,对于两个实际上相等但并不完全相等的顶点返回相同的值呢
我考虑过量化空间,也就是说,将整个场景中的地板精确到小数点。但是,在我上面的例子中,我会转到,例如
但是,我怎样才能得到一个哈希代码,对于两个实际上相等但并不完全相等的顶点返回相同的值呢
简言之,这是不可能的
如果所有x
的hashcode(x)==hashcode(x+eps)
,那么hashcode(x+eps)==hashcode(x+2*eps)
也是正确的
满足此要求的唯一方法是int hashcode(){return CONSTANT;}
,它的用途有限
因此,您的equals()
方法也有缺陷。要求它是可传递的,即如果a.equals(b)
和b.equals(c)
,那么a.equals(c)
,对于任何a
,b
,c
。你的定义并非如此
这将导致各种微妙的地狱,因为许多标准Java集合等都依赖于此。在将顶点放入地图之前,对数字进行四舍五入可能会更稳健。