好的,这是我的问题。我有一个卡片对象的链接列表。
我有以下方法
public void removeCard(Card card){
cards.remove(card);
}
如果我创建卡片c =新卡片(5,C);例如
并且有一张卡具有完全相同的值2,并且链接列表中的C(卡片)。
如果我调用方法CardPile.remove(card)
我没有得到任何错误,但不删除等于参数卡的元素。
任何想法为什么没有发生这种情况?
import java.util.LinkedList;
public class CardPile {
final char [] suit = {'C','D','H','S'};
final char [] rank = {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
LinkedList<Card> cards;
public CardPile(){
cards = new LinkedList<Card>();
}
public void addCard(Card card){
cards.addLast(card);
}
public void removeCard(Card card){
cards.remove(card);
}
public void removeSpecial(Card card){
LinkedList<Card> temp = new LinkedList<Card>();
for(int i=0; i<cards.size(); i++){
if(cards.get(i).equals(card)){
temp.add(cards.get(i));
}
}
cards = temp;
}
public void listCards(){
for(int i=0; i<cards.size(); i++){
System.out.print(cards.get(i).toString()+" ");
}
System.out.println();
}
public boolean isEmpty(){
if(cards.size()==0)
return true;
else
return false;
}
public Card drawCard(){
return cards.removeLast();
}
public boolean hasCard(Card card){
int index = 0;
boolean contained = false;
if(cards.size()==0){
System.out.println("error, cards size is 0");
return false;
}
else{
while(index<cards.size() && !contained){
if(cards.get(index).isEqual(card)){
System.out.println("Card found");
contained=true;
}
index++;
}
}
return contained;
}
}
答案 0 :(得分:8)
我敢打赌Card类不会覆盖equals()和hashcode()方法。
Object类的默认实现只检查“==”,即两个变量是否指向同一个对象实例。您需要重写equals()和hashcode()以提供适当的均衡检查。在此处查看有关该主题的出色讨论 - http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf
使用正确的equals()和hashcode(),您的代码可以进一步简化。例如,hasCard()方法可以简单地调用List方法contains()。
答案 1 :(得分:1)
可能他们不等于。
检查卡上的equals()方法。
答案 2 :(得分:1)
答案 3 :(得分:0)
你的Card类是否实现了equals和hashCode方法?每当需要逻辑相等而不是身份相等时(即两个引用指向同一个对象),程序员应该重写这两个方法。 java.lang.Object中的默认实现仅进行标识等式检查。