从链表JAVA中删除元素

use*_*514 1 java

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

我有以下方法

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

  }
Run Code Online (Sandbox Code Playgroud)

如果我创建卡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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jou*_*mer 8

我敢打赌Card类不会覆盖equals()和hashcode()方法.

Object类的默认实现只是检查"==",即两个变量是否指向同一个对象实例.您需要重写equals()和hashcode()以提供适当的均衡检查.请参阅此处有关该主题的出色讨论 - http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

使用正确的equals()和hashcode(),您的代码可以进一步简化.例如,hasCard()方法可以简单地调用List方法contains().