Javaで構築されたハッシュマップの実装を終了し、衝突を処理するために2次プロービングを使用しています。これを行うために、私は最初のハッシュ/テーブルインデックスに追加される次のオフセットを返すヘルパーメソッドを使用しています。Java - Math.ceilラウンド1.0から2.0まで
私はEclipseのデバッガでテストを行い、2
を渡すと、-1
を取得する必要がありますが、-4
を取得することがわかりました。これは、probeCount
でMath.ceil
が呼び出されたときに発生します。これは、呼び出し時には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はい、それはまさに問題でした。うわー。 2番目の目になってくれてありがとう。あなたが最初に答えたので、あなたが答えを投稿するなら、私は先に進み、それをマークします。 :) – Tyme96