2012-04-25 7 views
0

ユーザーは、導入した2つの色の組み合わせをユーザーが推測したかどうかを確認します。ハッシュマップに相当する要素を取得する

私は、 "TwoColors"オブジェクトとブール値を保存するためにHashMapを使用しています。 TwoColorsクラスは次です:

public class TwoColors{ 
    public MyColor color1; 
    public MyColor color2; 
    public TwoColors(MyColor color1, MyColor color2){ 
     this.color1 = color1; 
     this.color2 = color2; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     TwoColors o = (TwoColors) obj; 
     return color1 == o.color1 && color2 == o.color2; 
    } 
} 

そしてMyColorは、私がその値に

public static void main(String[] args){ 
    HashMap<TwoColors, Boolean> hash = new HashMap<TwoColors, Boolean>(); 
    hash.put(new TwoColors(MyColor.RED,MyColor.BLUE),new Boolean(true)); 
    System.out.println(hash.get(new TwoColors(MyColor.RED,MyColor.BLUE))); 
} 

上記のコードの出力nullをTwoColorオブジェクトのキーを入れて印刷するには、テスト

public enum MyColor{ 
    RED,BLUE,YELLOW,BROWN; 
} 

列挙型であります私はTwoColorsのequalsメソッドをオーバーライドしています。私はここで何が分からないのでしょうか?

+1

あなたは等号をオーバーライドする場合は、同様のhashCodeを上書きすることをお勧めします。 –

答えて

2

equalsをオーバーライドするときは、常にhashcodeをオーバーライドする必要があります。getを呼び出すことによって値をルックアップしようとしない場合、ハッシュマップはそれを見つけることができません。

理解のためにthisポストをお読みください。 Eclipseを使用して取得することができます

デフォルトのハッシュコード:

@Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((color1 == null) ? 0 : color1.hashCode()); 
     result = prime * result + ((color2 == null) ? 0 : color2.hashCode()); 
     return result; 
    } 

また、あなたの等号の実装では、それはそれを正しく実装していないという意味、量産コードではありません。あなたの実装はMyColorに盲目的にキャストしているので、ClassCastExceptionのために開いていますので、実装はNullPointerExceptionになりやすいです。両方の参照が同じであれば

@Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     TwoColors other = (TwoColors) obj; 
     if (color1 != other.color1) 
      return false; 
     if (color2 != other.color2) 
      return false; 
     return true; 
    } 

フィールド値のチェックをチェックする前に、ヌルをチェックするクラスの等価性をチェックし、最終的にフィールドの値をチェック:

それはこのような何かに似ている必要があります。

けれどもApacheはまた、JavaのドキュメントからHashCodeBuilderEqualsBuilder

+0

ありがとうございました。等号コードについて私は読んでもう少しきれいにするためにそれを置くが、もう一度、ありがとう –

1

があります維持するように、この方法は、[equals]、上書きされるたびに、hashCodeメソッドをオーバーライドすることが一般的に必要であることを

注意を等しいオブジェクトが等しいハッシュコードを持つ必要があることを示すhashCodeメソッドの汎用規約MyColor以来

が列挙され、あなたのクラスにこのコードを追加して、それを修正する必要があります

@Override 
public int hashCode() { 
    return color1.ordinal() + 31*color2.ordinal(); 
} 
関連する問題