2016-04-07 12 views
1

私が知っているところから、すべてのequalsオブジェクトは同じハッシュコードを持つ必要があります。しかし、equalsメソッドの中に複数のものがある場合は、それに従う必要がありますか?Javaハッシュコードの実装で複数の等価性とある場合

ロケーションはオブジェクト、ジャンクションはオブジェクト、長さは整数、オフセットは整数、セクションはオブジェクトです。

私はすでにatAJunctionメソッドのときに解決しましたが、ハッシュコードiは追加ハッシュコードとしてジャンクションを使用しました。 Sectionが等しい場合、セクションの長さは両方の位置のオフセットに等しくなります。私が使用しているハッシュコードは、sectionをハッシュコードとして使用しているだけです。

主な問題は、セクションが異なるがオフセットとエンドポイントが同じ場合です。その等価だがハッシュコードは異なる。

誰かが私の問題を助けることができますか?前にありがとう。 :)

これは私のEqualsメソッドです:

@Override 
public boolean equals(Object object) { 
    if(object == null){ 
     return false; 
    } 
    if(!(object instanceof Location)){ 
     return false; 
    }else{ 
     Location otherLocation = (Location) object; 
     if(atAJunction() && otherLocation.atAJunction()){ 
      return this.endPoint.getJunction().equals(otherLocation.getEndPoint().getJunction()); 
     }else{ 
      // The Problem Here 
      if(this.endPoint.equals(otherLocation.endPoint)){ 
       return this.offset == otherLocation.getOffset(); 
      }else{ 
       return this.section.equals(otherLocation.getSection()) && 
         this.section.getLength() == (this.offset + otherLocation.getOffset()); 
      } 
     } 
    } 
} 

そして、これは私のハッシュコードです:例については

@Override 
public int hashCode() { 
    // creates a polynomial hash-code based on the fields of the class. 
    final int prime = 13; // an odd base prime 
    int result = 1; // the hash code under construction 
    if(atAJunction()){ 
     result = prime * result + this.endPoint.getJunction().hashCode(); 
    }else{ 
     result = prime * result + this.section.hashCode(); 
    } 
    return result; 
} 
+0

equalsメソッドは正しいですか?平等性は再帰的でなければならないことを覚えておいてください:a.equals(b)とb.equals(c)then a.equals(c) - あなたがそのことを保証する方法がわかりません – Joni

+0

脇役としてif文にreturn文は、後でelseを使用しないでください。冗長であり、コードに乱雑さを増やします。 – niilzon

答えて

-1

くださいvisit another resourse。以下。その後、あなたは

// A better definition, but still not perfect 
@Override public boolean equals(Object other) { 
    boolean result = false; 
    if (other instanceof Point) { 
     Point that = (Point) other; 
     result = (this.getX() == that.getX() && this.getY() == that.getY()); 
    } 
    return result; 
} 


@Override public int hashCode() { 
       return (41 * (41 + getX()) + getY()); 
    } 
+0

「改善するかもしれません」という言葉は控えめなものです... – eis

+0

そのウェブサイトにすべての説明があります。 – GensaGames

+0

あなたはコードだけを含むように投稿全体を変更したようです。私も説明をすることをお勧めしたいと思います。 – eis

0

効果的なJavaでのように等しく、ハッシュコードを作成したより

public class Point { 

     private final int x; 
     private final int y; 

     public Point(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     public int getX() { 
      return x; 
     } 

     public int getY() { 
      return y; 
     } 

     // ... 
    } 

セクションが等しい場合は、理想的には、この追加のチェック

return this.section.equals(otherLocation.getSection()) && 
        **this.section.getLength() == (this.offset + otherLocation.getOffset());** 

を必要とする理由まず、私が理解しないものです、長さはすべてすでにそれで覆われている必要があります。あるオブジェクトの内部値と他のクラスの派生値を比較すると、エラーが発生しやすくなります。equals()のようなメソッドでは避けるべきです。

http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683をご覧ください。ここの著者は、ハッシュコードと等価の関係を適切な方法で説明します。これは間違いなくあなたに役立つだろう。

あなたの場合、hashcode()とequals()を生成する正しい方法があまり明確でない場合は、EclipseやnetbeansのようなIDEのコードジェネレータを使ってみてください。

+0

最初にあなたの答えをありがとう、私はそれを行うには、要件が必要なので、私は追加のチェックを使用します。 要件の1つである、等しくなる場所は です。セクションの長さは、位置オフセット+他の場所のオフセット(比較対象の別のオブジェクト)の合計と同じでなければなりません –

+0

しかし、この場合、this.offset + otherLocation.getOffset());およびthis.section.hashCode();矛盾している。 hashcodeはthis.offset + otherLocation.getOffset());を考慮していません。これはequalsによって使用されます。 –

関連する問題