2009-04-26 4 views
1

OK, вот моя проблема. У меня есть связанный список объектов карты.Удалить элемент из связанного списка JAVA

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

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

    } 

если я создаю карты с = новой карты (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; 
    } 
} 

ответ

1

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

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

+0

не имеют равных() метод в классе карты ... Я подумал, что если у вас есть LinkedList карт, то если вы просто звоните theList.remove (theCard) это будет просто удалить объект карты в списке, равном картой в параметре – user69514

+0

Это будет, но Java должен знать, что означает «равно» для вас. У вас есть isEqual, который предположительно должен быть переопределением равных. Обратите внимание, что вам действительно не нужно переопределять hashCode в этой ситуации, хотя вы можете. –

+0

Вы должны сделать привычкой всегда переопределять равные и hashCode одновременно. В противном случае трудно найти ошибки с хэш-таблицами. – starblue

1

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

8

Держу пари, что класс карты не отменяет метод equals() и hashcode().

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

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

0

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