我正在尝试创建自己的哈希码,但是我得到了一个空指针错误。是因为我的对象,Suit和Face,没有自己的哈希码?我一直在线查找哈希码的例子,因为这是我第一次使用它们,我尝试从我在网上看到的例子中加入。
import java.util.HashMap;
enum Suit {Diamonds, Hearts, Spades, Clubs};
enum Face {
King, Queen, Jack, Ten, Nine, Eight, Seven,
Six, Five, Four, Three, Two, Ace, Joker
};
public class SuitAndFace {
Suit suit;
Face face;
SuitAndFace(Suit s, Face f){
suit = s;
face = f;
}
public String toString(){
if(!face.toString().equals("Joker"))
return face + " of " + suit;
else//joker has no suit
return face.toString();
}
@Override
public boolean equals(Object o){
System.out.println(" in equals");
if(o instanceof SuitAndFace){
SuitAndFace s = (SuitAndFace) o;
if(this.face.equals(s.face) && this.suit.equals(s.face))
return true;
}
return false;
}
@Override
public int hashCode() {
int hash = 3;
hash = 7 * hash + this.suit.hashCode();
hash = 7 * hash + this.face.hashCode();
return hash;
}
}
更新的方法:
@Override
public boolean equals(Object o){
System.out.println(" in equals");
if(o instanceof SuitAndFace){
SuitAndFace s = (SuitAndFace) o;
if(face != null && suit != null && this.face.equals(s.face) && this.suit.equals(s.face))
return true;
}
System.out.println("no match!");
return false;
}
@Override
public int hashCode() {
int hash = 3;
if(suit != null && face != null){
hash = 7 * hash + this.suit.hashCode();
hash = 7 * hash + this.face.hashCode();
}
return hash;
}
答案 0 :(得分:2)
我刚刚意识到你似乎以suit == null
,face == Joker
代表笑话。如果卡片是小丑,只要你NullPointerException
,你就会获得suit.anything
。
该行可能是:
hash = 7 * hash + this.suit == null ? 0 : this.suit.hashCode();
或者,您也可以在Joker
枚举中添加Suit
常量,然后您就不必担心null
。
修改强>
使用您编辑的代码,我可以看到行
if(face != null && suit != null && this.face.equals(s.face) && this.suit.equals(s.face))
return true;
不太对劲。首先,您要比较suit
和face
(显然是一个错字)。我也猜你想让笑话平等吗?目前它们不会是因为如果suit == null
方法返回false
。这些行应该只是
if (face == s.face && suit == s.suit)
return true;
您不需要将.equals
用于枚举常量。使用==
的好处是,因为您没有使用方法,所以您不必担心空值。