web-dev-qa-db-ja.com

特定のクラスのhashCodeメソッドを作成するにはどうすればよいですか?

単純なクラスの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;
            }
        }
    }

ありがとう...

18
A Gore

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の引数をとらせることができます。これにより、タイプをチェックする手間が省けます。

17
nullptr

ハッシュコードはint(32ビット)であり、データはchar(16ビット)なので、おそらく次のようにします。

@Override
public int hashCode() {
    return (row << 16) + col;
}

これにより、rowのビットが最初の16ビットに配置され、colのビットが最後の16ビットに配置されるため、これは 完璧ですハッシュ関数 このクラスの場合。

クラスをより複雑にリファクタリングする場合は、nullptrの回答を使用することをお勧めします。


Comparableを使用するには、次のようにします。

public class Coord implements Comparable<Coord>
15
durron597