1

こんにちは、MovieCard という現在のオブジェクトを取得し、パラメーターとして渡された別の MovieCard と比較する Java 比較を作成しようとしています。以下のコード

boolean sameName(MovieCard movieCard) {

    if(this.MovieCard.equals(movieCard))


    return true;
} 

エラーでシンボルが見つかりません - 変数 MovieCard

これが違いを生む場合、チェックは MovieCard コンストラクターの前に私のクラスにリストされます。また、私は初心者のプログラミング クラスに参加しているため、Comparator を使用できず、これを含める必要があります。

4

6 に答える 6

2
boolean sameName(MovieCard movieCard) {
    return this.equals(movieCard);
} 
于 2013-10-23T06:52:14.997 に答える
1

MovieCard変数ではなくクラスです。そして、それがコンパイラーがあなたに伝えていることです。

if(this.MovieCard.equals(movieCard))
        ↑

おそらく、 だけを書く必要がありますthis

また、何も返さないパスが存在することに注意してください。これはコンパイルされません。

やったほうがいい:

boolean sameName(MovieCard movieCard) {
    return this.equals(movieCard);
}

または

boolean sameName(MovieCard movieCard) {
    if(this.equals(movieCard)) {
       return true;
    }
    return false;
} 
于 2013-10-23T06:51:11.353 に答える
1

このメソッドがMovieCardクラスに存在する場合は、thisそれで十分です。

boolean sameName(MovieCard movieCard) {
    if(this.equals(movieCard)) {// this is enough. this.MovieCard is wrong, as there is no variable by that name.
        return true;
    }
    return false; // Since return true is a conditional return, but the method needs to return in any case.
}

そして、あなたの方法の短縮版は次のようになります

boolean sameName(MovieCard movieCard) {
    return this.equals(movieCard); // Returns the result of the comparison.
}

メソッド名を見るsameName()と、オブジェクトそのものではなく、クラス内の名前フィールドを比較したいようです。

boolean sameName(MovieCard movieCard) {
    return this.getName().equals(movieCard.getName()); // Returns the result of the name comparison.
    // But there is a possible NPE in the above statement.
}
于 2013-10-23T06:51:15.667 に答える
1

のように使う

boolean sameName(MovieCard movieCard) {
    if(this.equals(movieCard))
       return true;
} 

しかし、あなたのメソッドは2つのオブジェクトが同じ名前かどうかをチェックしているようです. もしそうなら、あなたは単に使うことができます

boolean sameName(MovieCard movieCard) {

    if(this.name.equals(movieCard.name))
         return true;
} 

名前がメンバー変数(文字列)であると仮定

于 2013-10-23T06:51:41.480 に答える
1

あなたは書く必要があります

boolean sameName(MovieCard movieCard) {
 if (this.equals(movieCard)){
            return true;
        } else{
            return false;
        }
}

クラスthis.MovieCard 内の変数を指しているためです。Moviecard

あなたの構文エラーに加えて、あなたのequals実装はデフォルトの実装以外には何もしません

要確認 これは、 と が同じ参照を 指しているif (this.equals(movieCard)){ 場合にのみ当てはまります。movieCardthis

なぜなら、

java.lang.Objectequals()によって提供されるクラスのデフォルトの実装は、メモリ位置を比較し、2 つの参照変数が同じメモリ位置を指している場合、つまり本質的に同じオブジェクトである場合にのみ真になります。return

MovieCardフィールドの比較MovieCard'sが同じかどうかなど、クラスの equals メソッドをオーバーライドする必要があると思います。

読むことを好む、本質的Ovverideに等しい方法。

間違った方向に進んでいます。上記のリンクの例を参照してequalsから、MovieCard のすべてのフィールドが渡されたオブジェクトのフィールドに一致するように equals を実装してください。それはあなたが求めた実装です。

一般に、次のように 2 つの Tiger オブジェクトを等しいかどうか比較する例

 

@Override
  public boolean equals(Object object) {
    boolean result = false;
    if (object == null || object.getClass() != getClass()) {
      result = false;
    } else {
      Tiger tiger = (Tiger) object;
      if (this.color == tiger.getColor() //checking color and pattern same
          && this.stripePattern == tiger.getStripePattern()) {
        result = true;
      }
    }
    return result;
  }
于 2013-10-23T06:54:45.900 に答える
0

上記のすべての回答があなたの質問に答えているので、これも追加したいと思います。

equals呼び出されるメソッドはオブジェクト メソッドに属していることに注意してください。equalsそのため、プログラムのニーズに合わせてメソッドをオーバーライドすることが賢明です。equals をオーバーライドするときは、必ずhashcodeメソッドもオーバーライドしてください。

于 2013-10-23T07:02:31.713 に答える