2009-04-26 239 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中的默認實現只進行身份相等性檢查。