-2

2 枚のカード c1 と c4 は等しいように見えますが、そうではありません。セットで許可されるのは1つだけになるように、それらを等しくしたい。:|

import java.util.*;
class Card2
{
 private int value;
 private String type;

 public Card2(int v,String t)
 {
  value=v;
  type=t;
 }

 public int getValue()
 {
  return value;
 }

 public String getType()
 {
  return type;
 }

 public String toString()
 {
  return(type+" "+value);
 }

 public boolean equals(Object oo)
 {
  if(!(oo instanceof Card))
  return false;

  Card cc=(Card) oo;

  if(this.getValue()==cc.getValue() && this.getType().equals(cc.getType()))
  return true;
  else
  return false;
 }

 public int hashCode()
 {
  return value;
 }

 public static void main(String args[])
 {
  HashSet<Card> deck=new HashSet<Card>();

  Card c1=new Card(5,"Spade");

  Card c2=new Card(10,"Hearts");

  Card c3=c2; //Equal Ref card entity

  Card c4=new Card(5,"Spade");

  System.out.println(c1.equals(c4));

  deck.add(c1);
  deck.add(c2);
  deck.add(c4);
  deck.add(c3);

  for(Card cc:deck)
  System.out.println(cc);
 }
}
4

8 に答える 8

5

まず第一に、あなたはあなたのクラスを呼び出しCard2ましたが、それをCardどこでも参照します(equals()メソッドを含みます。この答えはあなたがのすべてのインスタンスをに置き換えることを前提としていますCard2Card

カードの値とタイプが同じであるかどうかequals()を返す方法で定義しました。true

c1の値5とタイプがありSpadeます。

c4の値5とタイプがありSpadeます。

見た目は私とほとんど同じです。

于 2010-01-26T12:59:14.783 に答える
2

それらは等しい(で置き換えてタイプミスを修正するとCard2Card、プログラム出力は次のようになります。

true
ハーツ10
スペード5

他に何を期待しましたか?

于 2010-01-26T12:58:59.963 に答える
1

あなたhashCode()はと矛盾していequals()ます。

java.util.HashSetを使用しhashCodeます。hashCode()タイプを考慮に入れるように実装する必要があります。

于 2010-01-26T12:57:44.577 に答える
1

何が問題ですか?私のシステムの出力は次のとおりです。

true
Spade 5
Hearts 10

これはまさにあなたが望むもののようです。

于 2010-01-26T13:00:50.810 に答える
1

equals() メソッドが間違っています。代わりにこれを試してください:

public boolean equals(Object oo)
{
  if(!(oo instanceof Card2))
    return false;

  Card2 cc=(Card2) oo;

  return this.getValue()==cc.getValue() && this.getType().equals(cc.getType());
}

つまり、Card と Card2 を一貫して使用する必要があります。

また、私があなたを変更したことに注意してください:

if(this.getValue()==cc.getValue() && this.getType().equals(cc.getType()))
  return true;
else
  return false;

return this.getValue()==cc.getValue() && this.getType().equals(cc.getType());

これはより短く、checkstyle ルールへの違反を回避するためです。これが良いアイデアである理由は、「何かが真の場合は真を返し、そうでない場合は偽を返す」ということなので、コードが複雑になるためです。コードの読者にあなたが何をしているのか理解させるのではなく、単に「何かを返す」と言うだけで、コードの最終的なユーザーはあなたが何をしているのかをより迅速に理解できます。

于 2010-01-26T13:23:21.077 に答える
0

equals()メソッドに欠落している別の等価性チェックがあります。オブジェクト自体が同じ参照であるかどうかを確認します。「c2.equals(c3)」のようなものを比較するときの短絡です。

public boolean equals(Object oo)
{
  if(!(oo instanceof Card2))
    return false;

  if(this == oo) //comparing an object to itself is equal
    return true;

  Card2 cc=(Card2) oo;

  return this.getValue()==cc.getValue() && this.getType().equals(cc.getType());
}
于 2010-01-26T14:43:16.790 に答える
0

equals メソッドにはいくつかの改善が必要です。null と同一性をテストする必要があります。また、サブクラス化を許可し、両方のクラスで equals を実装すると、instanceof を使用すると、equals が非可換になる可能性があります。たとえば、Card2 が Card を拡張し、Card に instanceof Card をテストする equals があり、Card2 が instanceof Card2 をテストする equals でこれをオーバーライドする場合、クラス Card2 のインスタンス cc2 と Card の別のインスタンス cc に対して instanceof を使用することは、次のことを意味します。 cc.equals(cc2) は true ですが、cc2.equals(cc) は false であり、望ましくない動作につながる可能性があります。

次のことができます。

public boolean equals(Object other) {
    // null is not equal
    if (null == other)
        return false;
    // same is equal
    if (this == other)
        return true;
    // different class, not equal
    if (other.getClass() != getClass())
        return false;

または、サブクラス化を許可する場合は、スーパークラスにあるプロパティのみをテストする必要があります。したがって、Card に値があり、Card2 が Card を拡張して値と型を持っている場合、equals メソッドは instanceof Card のみを検索し、Card の属性のみを比較する必要があります。

    //if (other.getClass() != getClass())
    //    return false;
    if (!(other instanceof Card))
        return false;
    card = (Card) other;
    if (this.getValue() == card.getValue())
        return true;
    return false;
} 

繰り返しますが、これはすべて問題とはまったく関係がない可能性があります。

于 2010-01-26T15:01:46.600 に答える
0

これは、最近のプロジェクトで好評だった Card クラスです。うまくいけば、それはあなたを助けるでしょう. http://pastebin.com/qW41nwRE
「状態」は、カードがデッキにあるか手札にあるかなどを判断するために使用されます。値は 1 から 14 で、11 から 14 はフェイス カード (ジャック、クイーン) です。 、キング、エース)。

于 2010-09-05T21:29:01.973 に答える