java - 在某个 epsilon 内检查 Java 对象的唯一性

原文 标签 java hashtable

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

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

我需要检查数百万个顶点,因此我打算将所有对象放入一个哈希表并查询它们是否是唯一的。覆盖 isEqual 很简单:取两个坐标之间的差的绝对值并除以 1 的大小。例如:
if (Math.abs((x2-x2)/x1) < 0.0000001) return true;
但是我如何想出一个哈希码,它会为两个有效相等但不完全相等的顶点返回相同的值?

我考虑过对空间进行量化,即将整个集合的地板保留到小数位。但是,在我上面的例子中,我会舍入到 <1.999, 1, 3> 和 <2.000, 1, 3> 例如。

最佳答案

But how do I come up with a hashcode that will return the same for two effectively equal, but not exactly equal vertices?



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

如果 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) , 对于 任意 a , b , c .您的定义并非如此。

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

关于java - 在某个 epsilon 内检查 Java 对象的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18487682/

相关文章:

java - 为什么 JAXB 有时会映射到 JAXBElement?

java - 通过 Java 套接字的服务器间通信

java - Android的处理| save()“文件包含路径分隔符”

java - 如何遍历 Map 并克隆每个值?

c - 当我没有分配空间时,为什么可以读写内存?

java - 如何将 swagger 与 Jersey + spring-boot 结合

java - 跺脚拦截器不工作

arrays - 查找负载超过 10% 网络的用户

c++ - 在C++中获取double的确切位表示形式

java - 与Java中的哈希图混淆?