2009-04-26 4 views
1

OKこれは私の問題です。私はカードオブジェクトのリンクされたリストを持っています。リンクリストから要素を削除するJAVA

私はカードC =新しいカード(5、C)を作成する場合、私は次のような方法

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

    } 

を持っています。例えば

となり、リンクリスト(カード)には全く同じ値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

私はカードクラスのequals()メソッドを持っていない...私はあなたがカードのLinkedListのを持っている場合は、単に theList.remove(theCard) を呼び出す場合、それは単にオブジェクトカードを取り外しますと思いましたリストの中では、パラメータ – user69514

+0

のtheCardと同じですが、Javaは "equals"が何を意味するのかを知る必要があります。あなたはisEqualを持っています。これは、おそらくequalsのオーバーライドでなければなりません。このような状況では、実際にはhashCodeをオーバーライドする必要はありませんが、できることに注意してください。 –

+0

equalsとhashCodeを同時にオーバーライドするのは習慣にしてください。それ以外の場合、ハッシュテーブルでエラーを見つけるのは難しいでしょう。 – starblue

1

チャンスは、カードクラスのequalsメソッドは '=='演算子だけを使用している可能性があります。同一の顔/スーツ値を持つ2つのオブジェクトが等しいとみなされるように比較が行われていることを確認します。

8

私はCardクラスがequals()とhashcode()メソッドをオーバーライドしないと確信しています。

オブジェクトクラスによるデフォルトの実装では、単に "=="をチェックします。つまり、2つの変数が同じオブジェクトインスタンスを指している場合です。 equals()とhashcode()をオーバーライドして、適切な等価性チェックを提供する必要があります。ここのトピックに関する優れた議論を参照してください。http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

適切なequals()およびhashcode()を使用すると、コードをさらに単純化できます。たとえば、hasCard()メソッドは単にListメソッドcontains()を呼び出すことができます。

0

あなたのCardクラスはequalsメソッドとhashCodeメソッドを実装していますか?同一性以外の論理等価が必要な場合(つまり、2つの参照が同じオブジェクトを指す場合)、プログラマはこれら2つの方法をオーバーライドする必要があります。 java.lang.Objectのデフォルトの実装では、アイデンティティの等価性チェックのみが行われます。

関連する問題