2013-08-28 65 views
1

我試圖通過檢查頂點的唯一性來修剪3D網格。但是因爲每個頂點都有某種與之相關的錯誤,所以兩個「相似」的頂點實際上可能是相同的。例如在一些ε內檢查Java對象的唯一性

< 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>。

+2

在將頂點放入地圖之前,將數字四捨五入可能會更加健壯。 – assylias

回答

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),爲任何abc。你的定義並非如此。

這將導致各種微妙的地獄,因爲許多標準的Java集合等依賴於此。