Удалить элемент из связанного списка JAVA - PullRequest
1 голос
/ 26 апреля 2009

ОК, вот моя проблема. У меня есть связанный список объектов карты.

У меня есть следующий метод

  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 ]

8 голосов
/ 26 апреля 2009

Могу поспорить, что класс Card не переопределяет equals () и hashcode ().

Реализация по умолчанию в классе Object просто проверяет "==", т. Е. Если две переменные указывают на один и тот же экземпляр объекта. Вам необходимо переопределить equals () и hashcode (), чтобы обеспечить правильную проверку на равенство. Смотрите отличную дискуссию по теме здесь - http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

При правильном использовании equals () и hashcode () ваш код может быть еще более упрощен. Например, метод hasCard () может просто вызвать метод List contains ().

1 голос
/ 26 апреля 2009

Скорее всего, метод equals в классе карты использует только оператор '=='. Убедитесь, что сравнения выполняются таким образом, чтобы два объекта с одинаковыми значениями лица / масти считались равными.

1 голос
/ 26 апреля 2009

Возможно, они не равны тогда.

Проверьте метод equals () на Карте.

0 голосов
/ 13 февраля 2012

В вашем классе Card реализованы методы equals и hashCode? Всякий раз, когда требуется логическое равенство, отличное от идентичности (то есть две ссылки указывают на один и тот же объект), программист должен переопределить эти два метода. Реализация по умолчанию в java.lang.Object выполняет только проверку на идентичность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...