私の知る限り、SortedMap
またはなどは、等式(、 )をチェックするために型に(ではなく)をSortedSet
使用します。compareTo
equals
Comparable<?>
contains
containsKey
しかし、特定のタイプが概念的に同等であるが、比較できない場合はどうなるでしょうか。
(ハッシュコード、メモリアドレス、...)
を宣言しComparator<?>
、メソッドをオーバーライドする必要がありますint compareTo(T o1, To2)
。OK、等しいと見なされるインスタンスに対して0を返すことができます。しかし、不規則な場合、注文が明確でない場合は何を返しますか?
SortedMapまたはSortedSetを同等に使用するアプローチは、(概念的には)同等のタイプではありませんか?
ありがとうございました!
編集:
並べ替えて保存したくないのですが、「通常の」マップとセットを使用すると、平等の動作を「オーバーライド」できませんでした。
編集2:
なぜ私は単にオーバーライドできないのですかequals(...)
:
私は外国のクラスの平等の振る舞いを変更する必要があります。編集できません。
編集3:
.NETについて考えてみてください:それらは、同等の動作に触れることなく、同等の動作を変更するIEquatableインターフェイスを備えています。
編集4:等しい場合は0を返し、等しくない場合は1を返す
ことはできませんか?compareTo
大きな問題は何ですか?いくつかのテストをドーム型にしましたが、SortedMap/SortedSetがインスタンスのペアでcompareToを一度呼び出したようです。はい、順序は意味がありませんが、なぜそれが私の問題になるのですか?注文は必要ありません。*私は平等行動を変える必要があります。悲しいことに、ほとんどの人はこれを理解できません。
注:等しくないインスタンスに対して1を返すという概念は、間違っていることが証明されました。
編集5:
平等を変える-外国のクラスの振る舞いは悪い概念ですか?もちろん?私はそうは思いません:なぜ私は外国のクラスの比較行動を使用して変更することを許可されているのComparator
ですか?
編集6:カスタムクラスでキータイプをラップするというアイデアに感謝
します。このようにして、equalsとhashCodeをオーバーライドして、equality-behaviorを変更できます。Mark Peters
waxwing