2009-04-26 134 views
1

好的,这里是我的问题。我有一个卡对象的链表。从链表中删除元素JAVA

我有以下方法

public void removeCard(Card card){ 
     cards.remove(card); 

    } 

如果我创建卡C =新卡(5,C);例如

链表(卡)

并且存在具有完全相同的值2的卡片,和C。

如果我打电话的方法CardPile.remove(卡)
我没有得到任何错误,但与参数卡相同的元素不会被删除。 任何想法为什么这不会发生?

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; 
    } 
} 

回答

1

也许它们并不等于那么。

检查卡上的equals()方法。

+0

我没有一个equals()方法在卡类...我想如果你有卡的LinkedList然后如果你简单地调用 theList.remove(theCard) 它只会删除对象卡在与参数 – user69514 2009-04-26 06:20:30

1

没准是只用“==”操作者在卡类equals方法。确保比较正在完成,以便两个具有相同面孔/花色值的对象被认为是相等的。

8

我敢打赌,卡类没有重载equals()和hashCode()方法。

由对象类默认的实现只是简单地检查“==”,即,如果两个变量指向相同的对象实例。您需要重写equals()和hashcode()以提供适当的均等性检查。看到这里的主题很好的论述 - http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

通过适当的equals()和hashCode(),您的代码可以简单求。例如,hasCard()方法可以简单地调用List方法contains()。

0

你的Card类实现了equals和hashCode方法吗?无论何时需要除身份相等之外的逻辑相等(即两个引用指向相同的对象),程序员应该重写这两个方法。 java.lang.Object中的默认实现只进行身份相等性检查。