我正在完成使用Java構建的哈希映射的實現,並且使用二次探測來處理衝突。爲此,我使用了一個幫助器方法,該方法將返回要添加到初始散列/表索引的下一個偏移量。Java - Math.ceil將1.0修改爲2.0
我已經通過Eclipse的調試器進行了測試,發現當我通過2
時,我得到了-4
,即使我應該得到-1
。發生這種情況時調用Math.ceil
probeCount
,在調用時等於1.0
。 Math.ceil
將probeCount從1.0
轉換爲2.0
,這會導致返回值不正確。
有人會幫我糾正代碼,並解釋我做錯了什麼?
這是輔助方法:
protected int nextBucketIndex (int probeCount) {
if (probeCount == 0)
return 0;
if (probeCount % 2 == 0) {
double n = (double) probeCount/2.0;
n = Math.ceil(probeCount); // <-----Line that produces the error.
n = Math.pow(n, 2);
n *= -1;
return (int) n;
} else {
double n = probeCount/2.0;
n = Math.ceil(probeCount);
n = Math.pow(n, 2);
return (int) n;
}
}
這裏是我使用的測試方法,測試案例:
@Test
public void nextBucketIndexShouldOperateByPattern() { // 1^2, -1^2, 2^2, -2^2, 3^2, etc.
HashCollection<Integer> table = new HashCollection<Integer>();
assertEquals (0, table.nextBucketIndex(0));
assertEquals (1, table.nextBucketIndex(1));
assertEquals (-1, table.nextBucketIndex(2));
assertEquals (4, table.nextBucketIndex(3));
assertEquals (-4, table.nextBucketIndex(4));
assertEquals (9, table.nextBucketIndex(5));
assertEquals (-9, table.nextBucketIndex(6));
assertEquals (16, table.nextBucketIndex(7));
assertEquals (-16, table.nextBucketIndex(8));
}
浮點數做有趣的事情。這大概是1.00000003,或者是一些愚蠢的東西,所以它會被收拾起來。有技術上的原因,我只是還沒有嘗試去學習它們。 – byxor
你確定你不是指'n = Math.ceil(n);'? – Kayaman
@Kayaman是的,那正是問題所在。哎呦。感謝您成爲第二雙眼睛。你首先回答,所以如果你發佈答案,我會繼續並標記它。 :) – Tyme96