从链表JAVA中删除元素

时间:2009-04-26 05:59:55

标签: java

好的,这是我的问题。我有一个卡片对象的链接列表。

我有以下方法

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

4 个答案:

答案 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)

很可能卡类中的equals方法只使用'=='运算符。确保正在进行比较,以便将具有相同face / suit值的两个对象视为相等。

答案 3 :(得分:0)

你的Card类是否实现了equals和hashCode方法?每当需要逻辑相等而不是身份相等时(即两个引用指向同一个对象),程序员应该重写这两个方法。 java.lang.Object中的默认实现仅进行标识等式检查。