9

equals特定の基準 (基準 A) に基づいて機能を実装した Java Bean オブジェクトがあります。別の基準 (基準 B) に基づいて一意のオブジェクトを識別する必要があります。equals関数は条件 A を使用するため、使用できませんHashSet。そこで、基準 B に基づくTreeSet私のカスタムで使用することを考えました。私の質問は、このようなことをしてもよいですか? Comparatorこのアプローチに問題はありますか?

ありがとうございました。

4

3 に答える 3

17

Oracle Java のガイドを次に示します。

Set インタフェースを正しく実装するためには、セットによって維持される順序 (明示的なコンパレータが提供されているかどうかにかかわらず) は equals と一致している必要があることに注意してください。(equals との整合性の正確な定義については、Comparable または Comparator を参照してください。) これは、Set インターフェイスが equals 操作に関して定義されているためですが、TreeSet インスタンスはその compareTo (または比較) メソッドを使用してすべての主要な比較を実行するため、この方法で等しいと見なされるキーは、セットの観点からは等しいです。セットの動作は、その順序付けが equals と一致しない場合でも明確に定義されています。Set インターフェースの一般的な契約に従わないだけです。

技術的には、いいえ、問題はないと思います。ただし、コーディング、可読性、保守性に関しては注意が必要です。なぜなら、他の人があなたのしていることを誤用したり誤解したりする可能性があるからです。

于 2010-09-07T03:29:19.527 に答える
1

検索を頻繁に実行し、要素を追加することはめったにない場合は、List基準Bで並べ替えて保持し、を使用することを検討してくださいCollections.binarySearch

于 2010-09-07T07:52:05.683 に答える
1

それらをラップできます:

class BeanWrapper {

 ...

 public boolean equals(Object other) {
  return myBean.critB.equals(((Bean)other).critB);
 }

}

そして、そのようにセットに入れます。

于 2010-11-28T14:07:52.427 に答える