2012-04-03 10 views
0

私はJavaでたくさんのオブジェクトを作ります。各オブジェクトには、属性領域と整数のセットがあります。私はこれらのオブジェクトを例えばマップに格納したい(キーは整数が成長する順序でなければならない)。 2つのオブジェクトは、その面積が等しく、そのセットが同じ場合、同じです。Javaで同じオブジェクトを見つける

2つのオブジェクトの面積が同じでない場合は、それらのセットが同じかどうかをチェックする必要はありません。

Javaでこれを実装するベストプラクティスは何ですか?ハッシュ関数と等価関数をどのように構成すればよいですか?

答えて

1

ここではIDEによって生成されたhashCode\equalsのサンプルペアだ(その後、最初area Sを比較するequals()コードを修正する。):

class Sample { 
    final int area; 
    final Set<Integer> someData; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Sample sample = (Sample) o; 

     if (area != sample.area) return false; 
     if (!someData.equals(sample.someData)) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = area; 
     result = 31 * result + someData.hashCode(); 
     return result; 
    } 
} 

このコードはsomeDataができないと仮定しnullにする - 事を単純化する。最初に等価性がチェックされていることがわかります。次にareaの等価性がチェックされ、等価性がSet<Integer>にチェックされています。これには内蔵のequalsSetであることに注意してください。そうすればそのメソッドを再利用できます。これは、化合物の型が等しいかどうかをテストする慣習的な方法です。

1

Comparableinterfaceを実装し、ロジックをcompareToメソッドでコーディングするだけでオブジェクトが必要です。あなたがそれを達成するのに役立つ良いものはlinkです。

+3

これは、オブジェクトをソートする場合にのみ必要です。もしあなたがそのようなオブジェクトの辞書を持っているだけなら、適切な 'hashCode()'と 'equals()'が必要です。 –

1

equals(最初は==の後に入力してチェックしてください)の領域を比較して、違いがある場合はfalseを返してください。面積が等しい場合は、セットを比較して比較してください。

一般にequals(及びhashCode)を実装するために、ここで(いくつかのさらなる参照を含む)a relevant threada good articleです。

1

親指のルールは(最初の最速なので、アップフロント、整数のセットをごarea Sを比較)あなたはequals()実装に関連するすべてのフィールドを比較しなければならないことであり、あなたのhashCode()で同じフィールドを使用します。疑問がある場合は、EclipseのSource - Generate hashCode() and equals()...機能使用