130

可能な重複:

compare()とcompareTo()の違い

Java:ComparableとComparatorの実装の違いは何ですか?

ComparableとComparatorの主な違いは何ですか。

そして、どのシナリオで他よりもどちらが優先されますか。

ありがとう

更新しました - 例との良好なリンク!

http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html


2 답변


176

クラスが実装するとき同程度のcompareToクラスのメソッドは、そのオブジェクトの「自然な」順序付けを定義しています。そのメソッドは、そのオブジェクト上の他のメソッドと一致することが(要求されてはいませんが)契約上義務付けられています。.equals()比較はtrueを返します。

Aコンパレータ2つのオブジェクトを比較する方法の独自の定義であり、自然な順序付けと一致しない可能性がある方法でオブジェクトを比較するために使用できます。

たとえば、文字列は通常アルファベット順に比較されます。したがって"a".compareTo("b")アルファベット順の比較を使用します。文字列の長さを比較したい場合は、カスタムコンパレータを作成する必要があります。

要するに、大した違いはありません。それらは両方とも同様の手段の目的です。一般的に、自然順に匹敵するものを実装し(自然順の定義は明らかに解釈に開放されています)、他のソートまたは比較の必要性のために比較器を書きます。


  • 比較対象はオブジェクト内に実装する必要があります。そのため、オブジェクトのcompareToメソッドを使用して、objectを比較する特定の種類の実装に含まれる依存関係が作成されます。ただし、コンパレータは外部化され、同じオブジェクトに対して複数のタイプのコンパレータを使用できます。私の理解のためにも修正が必要です。 - Sridhar
  • 私が遭遇したケースでは、任意のフィールドを条件付きでランダムにソートしたい場合があります。その場合は、クラスのコレクションをソートするためにComparatorを動的に渡すことができます。クラスに別のプロパティを追加してから、クラス内でImplement Comparableを実装します。それらは相互に排他的ではありません。 - markg
  • 「... ... Comparatorを実装」を使用できます。 " .. implements Comparable"を使用できますが、この場合の違いは何ですか? - powder366

121

Comparator制御できない型に対してカスタム比較ロジックを提供する方法を提供します。

Comparable実装しているオブジェクトを比較する方法を指定できます。

明らかに、あなたがクラスを制御できない場合(または、制御しているオブジェクトを比較するために複数の方法を提供したい場合)、以下を使用してください。Comparator

そうでなければあなたが使用することができますComparable


  • ソースを管理ここにキーワードです。 - Jonas Gröger
  • @ JonasGrö gerクラスを管理できないというのはどういう意味ですか? - TheLogicGuy
  • @TheLogicGuy依存関係や他のコードからのクラスであれば、クラスを制御することはできません。変更することはできません。 - Jonas Gröger
  • 外部ライブラリからインクルードしているクラスにコードを追加することはできません。クラス本体内にcompareTo()メソッドを追加できるようにする必要があるため、Comparableは自分で作成したクラスに対してのみ機能します。 - Webber

リンクされた質問


関連する質問

最近の質問