5

単純な POJO クラス Class1 があり、int 型のフィールドが 2 つあるとします。

クラスのインスタンスをセットに入れるために、 hashCode () およびequals () メソッドを実装して、これら 2 つのフィールドを正確に処理しました。

ここまでは順調ですね。

ここで、最初のフィールドが equal である場合に Class1 のインスタンスが等しいと見なし、等価条件を弱くする別のセットが必要です。2 番目のフィールドのみを同等性をチェックするものと見なす別のセットが必要になる場合もあります。

出来ますか?もしそうなら、どのように?

4

2 に答える 2

5

関心のあるフィールドのみを検査するカスタムを提供するときに を使用することで、その効果を得ることができます。TreeSetComparator

ただし、厳密に言えば、オブジェクトのメソッドを効果的に無視するため、そのようなTreeSetはもはや「正しい」ものではないことに注意してください。Setequal()

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

于 2013-06-12T05:34:54.243 に答える
3

標準 Java ライブラリはこれをサポートしていません。

そして (驚くべきことに)これをサポートする Apache Commons Collections または Guava ライブラリにはMaporクラスがないようです。Set

十分に調べれば、これをサポートする他のライブラリがおそらくあるでしょう。

または、独自のコードを作成することもできます ... 標準HashMapコードから始めます。


equals安くて陽気な代替手段は、ほとんどのメソッドをラップされたクラスに委譲し、元とは異なる/hashcodeペアを提供する要素タイプの軽量ラッパー クラスを作成することです。これを行うと、実行時にわずかなペナルティが発生しますが、検討する価値があります。

あなたのセットが特に大きくなる可能性が高い場合を除き、Joachim の提案も良いものです。(適切に実装されたハッシュ テーブルと比較しTreeSetてルックアップがあります。)O(logN)O(1)

于 2013-06-12T06:03:19.753 に答える