6

休暇の後に戻って:)質問をしてください。ComparableDocumentation からComparableインターフェイスのドキュメントを読んでいます 。私は、並べ替えと自然な順序付けを提供するため、comparable を使用していることを理解しています。ドキュメントでは、次のように書かれています。

自然な順序付けが equals と一致することを強くお勧めします (必須ではありません)。これは、明示的な比較子のないソートされたセット (およびソートされたマップ) が、自然な順序付けが equals と矛盾する要素 (またはキー) で使用されると、「奇妙な」動作をするためです。特に、そのようなソート済みセット (またはソート済みマップ) は、equals メソッドに関して定義されているセット (またはマップ) の一般規約に違反しています。

Comparable は equals とどのように関連していますか。ComparableにはcompareToメソッドがあり、なぜequalsメソッドと一致する必要があるのですか? 私はこの概念を理解できません。

また、情報源から引用して、誰かがこの点についても詳しく説明できますか

たとえば、(!a.equals(b) && a.compareTo(b) == 0) となる 2 つのキー a と b を、明示的なコンパレータを使用しないソート済みセットに追加すると、2 番目の追加操作は false を返します。 (そしてソートされたセットのサイズは増加しません) a と b はソートされたセットの観点から同等であるためです。

ありがとう。

4

3 に答える 3

8

compareTo0 を返すセマンティクスは、2 つのオブジェクトが等しいということです。あなたの引用にも記載されているように、他のメソッドで同じ関係の別の定義を持つことは明らかに多くの種類の問題を引き起こす可能性があります.SortedSet実装の典型的なアルゴリズムはに依存していますcompareToが、インターフェースの一般的な契約では、SetであるオブジェクトequalscompareToとからのレポートの不一致はequals、まさにそのような状況をもたらします。

于 2013-08-18T18:24:56.420 に答える
4

簡単な答え: 2 つのオブジェクトと をcompareTo(a,b)返すときはいつでも、と である必要があります。逆もまた同様です。0aba.equals(b)b.equals(a)true

長い答え:Comparableドキュメントに記載されているように、 の実装はComparable完全な順序付けを強制します。全順序付けの特性の1 つは「反対称」です。全順序付け ≤ を定義すると、次のようになります。

a ≤ b かつ b ≤ a の場合、a = b

これは の0戻り値として表されますcompareTo()

この特性は、より正確で効率的な動作のために、引用したテキストで言及されているメソッドとクラスによって悪用されます。

于 2013-08-18T18:23:48.680 に答える
2

Set のドキュメントで確認できます。

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

于 2013-08-18T18:25:39.283 に答える