キーとしてjava.awt.Dimensionを使用する必要があります。
寸法キー=新しい寸法(4,12);
Dimensionには、(4,12)と(12,4)のハッシュコードが異なるように、正の整数のペアごとに異なるhashCodeを生成する非常に優れたhashCode()メソッドがあります。だから、これらのインスタンス化と非常に良いhashCodesを作るのは速いです。
私は彼らがクラスを不変にしてもらいたいと思いますが、Dimensionでモデル化した独自の不変クラスを作ることができます。あなたは0から14まで順にハッシュコードをたどる場合は、パターンを参照してくださいよ、
0 1 2 3 4 <-- width
+--------------------
0 | 0 2 5 9 14
1 | 1 4 8 13
2 | 3 7 12
3 | 6 11
4 | 10
^
|
height
:
はここで幅と高さの異なる値のハッシュコードを示す表です。ここで
は、このハッシュコードを生成したコードです:
public int hashCode() {
int sum = width + height;
return sum * (sum + 1)/2 + width;
}
あなたは最後の行の内側三角数の計算式を認識することができます。そのため、表の最初の列にはすべての三角形の数字が含まれています。
スピードを上げるには、コンストラクタでhashCodeを計算する必要があります。あなたはおそらくメソッドに等しい必要があります場合は、もちろん
public class PairHash {
private final int hash;
public PairHash(int a, int b) {
int sum = a+b;
hash = sum * (sum+1)/2 + a;
}
public int hashCode() { return hash; }
}
、しかし、あなたはありませんオーバーフロー、あなたは非常に高速なものを追加することができます正の整数に自分自身を制限します。だから、あなたの全クラスは次のようになります。
public class PairHash {
// PAIR_LIMIT is 23170
// Keeping the inputs below this level prevents overflow, and guarantees
// the hash will be unique for each pair of positive integers. This
// lets you use the hashCode in the equals method.
public static final int PAIR_LIMIT = (int) (Math.sqrt(Integer.MAX_VALUE))/2;
private final int hash;
public PairHash(int a, int b) {
assert a >= 0;
assert b >= 0;
assert a < PAIR_LIMIT;
assert b < PAIR_LIMIT;
int sum = a + b;
hash = sum * (sum + 1)/2 + a;
}
public int hashCode() { return hash; }
public boolean equals(Object other) {
if (other instanceof PairHash){
return hash == ((PairHash) other).hash;
}
return false;
}
}
負の値はいくつかの重複したハッシュコードを生成するので、これを正の値に制限します。しかし、この制限があると、これらは最速のhashCode()メソッドとequals()メソッドで記述することができます。 (もちろん、コンストラクタでhashCodeを計算することで、不変クラスでhashCodeをできるだけ速く書くことができます)。
これらの制約を満たすことができない場合は、パラメータを保存するだけです。
public class PairHash {
private final int a, b, hash;
public PairHash(int a, int b) {
this.a = a;
this.b = b;
int sum = a+b;
hash = sum * (sum+1)/2 + a;
}
public int hashCode() { return hash; }
public boolean equals(Object other) {
if (other instanceof PairHash) {
PairHash otherPair = (PairHash)other;
return a == otherPair.a && b == otherPair.b;
}
return false;
}
しかし、ここではキッカーです。このクラスはまったく必要ありません。数式は数値の各ペアに固有の整数を与えるので、その整数をマップキーとして使用できます。 Integerクラスには、高速のequals()メソッドとhashCodeメソッドがあり、正常に動作します。このメソッドは、2つの短い値からハッシュキーを生成します。制限は、入力が正の短い値である必要があることです。オーバーフローしないように保証されています。中間合計をlongにキャストすると、以前の方法よりも広い範囲が得られます。すべての正のshort値で機能します。
static int hashKeyFromPair(short a, short b) {
assert a >= 0;
assert b >= 0;
long sum = (long) a + (long) b;
return (int) (sum * (sum + 1)/2) + a;
}
私はコンマ区切りの文字列は良い考えだと思います。私はこのアプローチを常に使用しています。 – mob