2013-04-15 11 views
8

私はmyObjectのコレクションcollを持っています。コレクションにそのような要素がない場合にのみ、collに要素を追加したいと思います。ユニークな要素のJavaコレクション

myObjectのequalsメソッドをオーバーライドしました。 20種類の属性が等しいかどうかをチェックします。

しかし、コレクションの場合、これらの属性の1つにのみ基づいて等価チェック(したがって追加)を行いたいと思います。

多分私のアーキテクチャに欠陥があり、2つの異なる定義を持つ必要があります。

しかし、あまりリファクタリングしなくても、私がここから欲しいものを達成することは可能でしょうか?つまり、Setコレクションのようなものがありたいのですが、ここで比較チェックを行う方法を教えてください。これは、Compare.sort()メソッドと似ています。このメソッドでは、比較を行うコンパレータを提供できます。

+0

それから何ですか?このコンパレータはどのように使用しますか? – jbenz

+1

SortedSetを見てください。おそらくそれはあなたのために動作します –

+0

SortedSetが動作する可能性があります。私は非常に慎重だ、しかし、あなたのコンパレータは等しくおよび/または完了と一致しないため。 – Thilo

答えて

8

HashSetとなります。ここでのコメントと同様に、すべてのオブジェクトの一意性を提供するためにhashcodeとequalsメソッドをオーバーライドする必要があります。hereの関係を読むことができます。

+0

あなたはhashCodeを働かせなければなりません(少なくとも後者はここではそうではありません)。 – Thilo

+1

何に基づいてユニーク?それが問題です。ハッシュセットをインスタンス化するときに2つの要素が一意であるかどうかを示す方法を提供できますか? – jbenz

+0

@jbenz編集後に意味がありますか? –

2

あなたはSetとその実装の1つを探しています。

+0

'equals'を使わないものが必要です。 – Thilo

2

ここで一意性を強制するために既存のコンテナを使用することはできません。これらはすべてequalsを使用するためです。

属性が1つのみの場合は、その属性をキーとしてマップを使用できます。 これは、その属性の値ごとに1つのエントリしか許可しません。

equalsおよびhashCodeは、コレクションで使用することを意図しています。デザインを変更する必要があります。たぶん自分の等号(あなたが今持っているもの)を別のものと呼ぶかもしれません。たぶんこれらのものをコレクションに直接入れないで、何らかの種類のアダプタにラップしているかもしれません。

+0

おそらく、setから継承した私の独自のコレクションを使って、等価性テストのメソッドをオーバーライドできますか? – jbenz

+0

はい、できます。 – Thilo

0

TreeSet(コンパレータコンパレータ)を使用することにより、 'equals/hashCode'実装に頼る必要はありません。

同様に、コレクションがリストの場合は、コンパレータCollections.sort(リストリスト、コンパレータc)を使用して並べ替えることができます。

関連する問題