[英]How to write hashCode method for a particular class?
我正在尝试为我的简单类生成一个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;
}
}
}
谢谢...
要实现hashCode,您可以覆盖Object的默认实现:
@Override
public int hashCode()
{
return row ^ col;
}
这不是一个理想的哈希,因为它的结果是非常可预测的,并且两个不同的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
类型,这样可以省去检查其类型的麻烦。
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;
}
}
类似于durron597的答案,如果您的输入受char限制(0到65535之间),您可以尝试这个
public int hashCode(){
return row * 100000 + col;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.