A G*_*ore 17 java class character hashcode compareto
我正在尝试为我的简单类生成一个hashCode()方法,但我没有得到它的任何地方.我将不胜感激任何帮助.我已经实现了equals()方法,如下所示,并且还想知道我是否需要实现compareTo()方法.我已经导入java.lang.Character来使用character.hashCode()但它似乎不起作用.
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;
        }
    }
}
提前致谢...
comparTo()方法给了我java.lang.Comparable转换错误..
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;
            }
        }
    }
谢谢...
nul*_*ptr 17
要实现hashCode,您可以覆盖Object的默认实现:
@Override
public int hashCode()
{
    return row ^ col;
}
这不是一个理想的哈希,因为它的结果是非常可预测的,并且两个不同的Coord对象很容易返回相同的值.更好的哈希将使用(http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html)中的内置Arrays类:java.util
@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,这将节省你检查其类型的麻烦.
dur*_*597 15
Hashcode是一个int(32位),你的数据是char(16位),所以我可能会这样做:
@Override
public int hashCode() {
    return (row << 16) + col;
}
这将比特row放在前16位中,而比特col放在最后16位中,因此这是该类的完美散列函数.
如果你重构你的课程更复杂,我建议使用nullptr的答案.
要使用Comparable,请执行:
public class Coord implements Comparable<Coord>
我找到了有关这个主题的非常有价值的信息以及Joshua Bloch撰写的Effective Java书中的许多其他主题.有关hashCode()和equals()的更多信息,请参见第45页.
如果您使用像Eclipse这样的IDE,您可以让它生成hashCode()和equals()方法.对于您的班级,结果将是:
class Coord implements Comparable<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;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + col;
        result = prime * result + row;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Coord other = (Coord) obj;
        if (col != other.col)
            return false;
        if (row != other.row)
            return false;
        return true;
    }
    public int compareTo(Coord param) {
        // Implementation according to http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
        return 0;
    }
}
| 归档时间: | 
 | 
| 查看次数: | 16726 次 | 
| 最近记录: |