単純なクラスのhashCode()メソッドを生成しようとしていますが、どこにも行きません。助けていただければ幸いです。次のように見えるequals()メソッドを実装しました。また、compareTo()メソッドを実装する必要があるかどうかも知りたいです。 character.hashCode()を使用するためにJava.lang.Characterをインポートしましたが、機能していないようです。
private class Coord{
private char row;
private char col;
public Coord(char x, char y){
row = x;
col = y;
}
public Coord(){};
public char getX(){
return row;
}
public char getY(){
return col;
}
public boolean equals(Object copy){
if(copy == null){
throw new NullPointerException("Object entered is empty");
}
else if(copy.getClass()!=this.getClass()){
throw new IllegalArgumentException("Object entered is not Coord");
}
else{
Coord copy2 = (Coord)copy;
if(copy2.row==this.row && copy2.col==this.col)
return true;
else
return false;
}
}
}
前もって感謝します...
Java.lang.Comparableキャストエラーを発生させているcomparTo()メソッド。
public int compareTo(Object copy){
if(copy==null){
throw new NullPointerException("Object entered is empty");
}
else if(copy.getClass()!=this.getClass()){
throw new IllegalArgumentException("Object entered is not Coord");
}
else{
Coord copy2 = (Coord)copy;
if(copy2.row==this.row && copy2.col==this.col){
return 0;
}
else if(copy2.col < this.col){
return -1;
}
else{
return 1;
}
}
}
ありがとう...
HashCodeを実装するには、Objectのデフォルトの実装をオーバーライドします。
@Override
public int hashCode()
{
return row ^ col;
}
結果は非常に予測可能であり、2つの異なるCoord
オブジェクトが同じ値を返すのは簡単なので、これは実際には理想的なハッシュではありません。より良いハッシュは、Java.util
の組み込みのArrays
クラスを利用します( http://docs.Oracle.com/javase/7/docs/api/Java/util /Arrays.html ):
@Override
public int hashCode()
{
return Arrays.hashCode(new Object[]{new Character(row), new Character(col)});
}
このメソッドを使用して、任意の数のフィールドでかなり良いハッシュを生成できます。
CompareToを実装するには、クラスに実装する必要があります Comparable :
public class Coord implements Comparable<Coord>
これを行ったら、compareToにタイプCoord
ではなくタイプObject
の引数をとらせることができます。これにより、タイプをチェックする手間が省けます。
ハッシュコードはint
(32ビット)であり、データはchar
(16ビット)なので、おそらく次のようにします。
@Override
public int hashCode() {
return (row << 16) + col;
}
これにより、row
のビットが最初の16ビットに配置され、col
のビットが最後の16ビットに配置されるため、これは 完璧ですハッシュ関数 このクラスの場合。
クラスをより複雑にリファクタリングする場合は、nullptrの回答を使用することをお勧めします。
Comparable
を使用するには、次のようにします。
public class Coord implements Comparable<Coord>