我正在Java开发一个纸牌游戏,我试图比较hashMap中的键和ArrayList中的元素(两者都是对象)。hashCode()和equals()被重写,但出现了一个错误,我不确定它的哪一部分是错误的。
这是纸牌课
class Cards implements Comparable<Cards> {
public String suit;
public String face;
public Cards() {
}
//Create Cards object
public Cards (String suit, String face){
this.suit = suit;
this.face = face;
}
//Return card suit
public String getSuit() {
return suit;
}
//Return card face
public String getFace() {
return face;
}
@Override
public int compareTo(Cards currentCards) {
if (getSuit().compareTo(currentCards.getSuit()) > 0) {
return 1;
} else if ((getSuit().compareTo(currentCards.getSuit())) < 0){
return -1;
} else if ((getSuit().compareTo(currentCards.getSuit())) == 0){
if (getFace().compareTo(currentCards.getFace()) > 0){
return 1;
} else if (getFace().compareTo(currentCards.getFace()) < 0){
return -1;
}
}
return 0;
}
@Override
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Cards))
return false;
Cards other = (Cards)o;
boolean suitEquals = (this.suit == null && other.suit == null) ||
(this.suit != null && this.suit.equals(other.suit));
boolean faceEquals = (this.face == null && other.face == null) ||
(this.face != null && this.face.equals(other.face));
return suit && face;
}
@Override
public int hashCode() {
int result = 17;
if (suit != null) {
result = 31 * result + suit.hashCode();
}
if (face != null) {
result = 31 * result + face.hashCode();
}
return result;
}
}
我们要做的比较
/**Creating Cards object*/
String[] SUIT = new String[]{ "d", "c", "h", "s" };
String[] FACE = new String[]{ null, "A", "2", "3", "4", "5", "6", "7", "8", "9", "X", "J", "Q", "K" };
Cards[] cardDeck = new Cards[52];
int index = 0;
for (int i = 0; i <= 3; i++) {
for (int j = 1; j <= 13; j++) {
cardDeck[index] = new Cards(SUIT[i], FACE[j]);
index++;
}
}
/**Player 1 in hand*/
ArrayList<Cards> player1 = new ArrayList<Cards>();
int j=0;
for (int i = 0; i <18; i++){
player1.add(i, cardDeck[j++]);
}
for(Cards n : player1){
if (Points.containsKey(n)){
System.out.println("Card points: " + Points.get(n));
}
}
错误:点击查看错误图片
您正在尝试使用两个字符串对象作为布尔对象:
更换返回服&&面;在您的equals方法中,返回suitEquals&&facequals。
在这里,对象返回相同的hashcodes,所以为了避免在向HashMap添加数据时重写,我有一个返回false的equals方法。现在,当我使用get时,我得到了正确的数据示例obj1和obj给出了准确的值,但我的问题是,当它们的hashcode相同时,java如何区分不同的对象并从hashmap返回它们的准确值。
菜单栏: Code —> Generate —> equals() and hashCode() 右键菜单:Generate —> equals() and hashCode() 快捷键: Mac: command + N Windows\/Linux: Alt + Insert —> equals() and hashCode()
如果你有如下需求,你必须重载 equals() 和 hashCode() 方法: 想把持久类的实例放入 Set 中(当表示多值关联时,推荐这么做),而且 想重用脱管实例 Hibernate 保证,仅在特定会话范围内,持久化标识(数据库的行)和 Java 标识是等价的。因此,一旦我们混合了从不同会话中获取的实例,如果希望 Set 有明确的语义,就必须实现 equals() 和 hashCode()。
我正在尝试使用equals方法与对象进行比较,但它总是返回false
本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha
问题内容: 以下代码示例的输出是: {1–e = e2,2–e1 = e1} 我不明白对象如何能够覆盖对象中的键,但不能覆盖值。以我的理解,输出应该是: {1–e2 = e2,2–e1 = e1} 问题答案: 实际上,您将其倒退了。该值被覆盖。密钥没有被替换,因为就e和e2而言,它们是相同的。 您的输出是: