122

両方を実装するクラスを見ました同程度のそしてコンパレータ。これは何を意味するのでしょうか?なぜ私は一方をもう一方に使うのでしょうか?


  • あなたはそれらのJavadocを読んだことがありますか?それは違いをかなり明確に説明しています。 - skaffman
  • 比較可能なものと比較可能なもの、および比較可能なものと比較可能なものを使用する場合。これらを知るためにこのリンクを読んでください。これはあなたが彼らのふるまいと用法を理解するのを助けるでしょう。http://iandjava.blogspot.in/2012/10/comparable-and-comparator.html - RockStar
  • これは良い、客観的な答えを持つ良い質問です。私はそれが閉鎖されていることに失望しています。 - Russell Silva
  • その他の質問StackOverflowでは、これを「コンパレーターと比較可能なものの違いは何ですか?」と定義しています。質問。なぜ「非建設的」とマークされているのですか。 Java初心者として、これは非常に役に立つ質問でした! - Pete
  • experts-exchange.com/Programming/Languages/Java/… - akjain

11 답변


211

以下のテキストは比較対比較可能

同程度の

匹敵するオブジェクトは他のオブジェクトとそれ自身を比較することができます。クラス自体がjava.lang.Comparableそのインスタンスを比較できるようにするためのインターフェース。

コンパレータ

比較オブジェクトは、2つの異なるオブジェクトを比較できます。クラスはそのインスタンスを比較していませんが、他のクラスのインスタンスを比較しています。このコンパレータクラスは、java.util.Comparatorインタフェース。



131

実装するComparable「自分と他のオブジェクトとを比較できる」という意味です。これは通常、単一の自然のデフォルト比較があるときに便利です。

実装するComparator「他の2つのオブジェクトを比較できる」という意味です。これは通常、型の2つのインスタンスを比較する方法が複数ある場合に便利です。年齢、名前などで人々を比較できます。


  • みなさん、こんにちは。比較コードと比較コードを使ってコードを削除してください。 - Mdhar9e
  • @ mdhar9e:例がたくさんあります - それらをあなたの特定のシナリオに翻訳するのが難しいと感じる場合は、新しい質問でより多くの情報を与えてください。 - Jon Skeet
  • @alireza:2番目の段落で既に例を示しました。異なる比較子を持つことで、同じコレクション(人)を異なるプロパティ(年齢、名前など)で並べ替えることができます。するだけではできませんPerson実装するComparable変更できません。どうやって二人が比較されます。 - Jon Skeet
  • @feelgoodandprogramming:いいえ、それらは異なるソートですアルゴリズム。ここには、3つの異なるクラスで、潜在的に3つのコードがある。1)エンティティそれ自体、例えば。Person。 2)比較器。PersonAgeComparatorこれは、2つの異なるエンティティを比較して、その特定のソート順でどちらを先にするかを決定することができます。 3)ソートコード。エンティティのコレクションとコンパレータを受け取り、コンパレータを使用してそのコレクションをソートして順序を決定します。 - Jon Skeet
  • @RishiKeshPathak:比較すべき明らかなことが1つしかない場合は、Comparableを使用することをお勧めします。そしてそれでもあなたはできるコンパレータを書くだけです。同じクラスを使用している2つの異なるプログラムがあり、一方が年齢だけで、もう一方が名前だけでソートしたい場合は、少なくとも1そのうちの一つは、コンパレータを使用する必要があります。 - Jon Skeet

34

Comparableはクラスに独自の比較を実装させます。

  • 入った同じクラス(それはしばしば利点です)
  • あり得る1つの実装のみ(2つの異なるケースが必要な場合は使用できません)

比較すると、Comparatorは外部比較です。

  • 通常は一意のインスタンスにあります(同じクラスまたは別の場所にあります)。
  • 君は各実装に名前を付けるソートしたい方法で
  • あなたはのためのコンパレータを提供することができます自分が管理していないクラス
  • 実装は最初のオブジェクトがnullの場合でも使用可能

両方の実装で、あなたはまだできます比較したいものを選択してください。 総称を使うと、宣言してコンパイル時にチェックすることができます。これにより安全性は向上しますが、適切な値を決定することも難題です。

ガイドラインとして、私は一般にそのオブジェクトが比較されることができる最も一般的なクラスまたはインタフェースを使用します、私が想像するすべてのユースケースで...しかし、あまり正確ではない定義! :-(

  • Comparable<Object>コンパイル時にすべてのコードでそれを使用することを可能にします(必要ならば良いです、そうでなければ悪いです、そしてあなたはコンパイル時エラーを失います)。実装はオブジェクトに対処し、必要に応じて、ただし堅牢な方法でキャストする必要があります。
  • Comparable<Itself>それどころか非常に厳しいです。

面白いことに、自分自身をサブクラスにサブクラス化するとき、サブクラスも比較可能でそれについて頑強でなければなりません(またはそれはLiskov Principleを破り、ランタイムエラーを起こすでしょう)。


18

java.lang.Comparable

  1. 実装するComparableインタフェース、クラスは単一メソッドを実装しなければならないcompareTo()

    int a.compareTo(b)

  2. インスタンスをソートしたいクラスを変更する必要があります。そのため、クラスごとに1つのソート順序しか作成できません。

java.util.Comparator

  1. Comparatorインタフェースを実装するには、クラスは単一のメソッドを実装する必要がありますcompare()

    int compare (a,b)

  2. インスタンスをソートしたいクラスとは別のクラスを作成します。そのため、クラスごとに複数のソート順序を作成できます。


14

Comparableたとえば、データオブジェクトが自然な順序を持つ場合など、データオブジェクトにデフォルトの順序を設定するためのものです。

AComparator特定の用途のための順序付け自体を表します。


7

Comparable通常は好ましいです。しかし時々クラスはすでに実装していますComparableしかし、あなたは別のプロパティでソートしたいと思います。それならあなたはComparator

実際に提供するクラスもありますComparators一般的な場合例えば、Stringソート時にはデフォルトで大文字と小文字が区別されますが、静的変数もあります。Comparator呼ばれるCASE_INSENSITIVE_ORDER


  • Comparableが優先されることに同意するかどうかわかりません。いくつかのオブジェクトは自然な順序の強い意味を持っています - 自然数、実数、日付など、あらゆる形式の数です。アプリケーションドメインモデルのエンティティのようなより複雑なオブジェクトの場合、Comparableの実装は通常間違いです。それらの多くの特性は、どの順序が最も頻繁に望まれるであろうかを予想することをあまりにも困難にします。 - erickson

6

ここに私がウェブ上で見つけたComparatorとComparableの間のいくつかの違いがあります:

  1. あなたがそれを見れば、これら2つの間の論理的な違いは、JavaにおけるComparatorが彼に与えられた2つのオブジェクトを比較するのに対し、Comparableインターフェースは "this"参照を指定されたオブジェクトと比較する。

  2. Javaで比較可能なオブジェクトの自然な順序を実装するために使用されます。 Java API Stringでは、DateクラスとwrapperクラスがComparableインタフェースを実装しています。

  3. いずれかのクラスがJavaでComparableインターフェイスを実装する場合、そのオブジェクトのコレクションListまたはArrayは、Collections.sort()またはArray.sort()メソッドを使用して自動的にソートでき、オブジェクトはCompareToメソッドで定義された自然順序に基づいてソートされます。

  4. JavaでComparableを実装するオブジェクトは、ソートマップのキーまたはソートセットの要素(TreeSetなど)として使用できます。ただし、Comparatorを指定する必要はありません。

site:JavaでComparatorとComparableを使用する方法例では

続きを読む:JavaでComparatorとComparableを使用する方法例では


5

Comparable自然な順序のオブジェクト用です。オブジェクト自体は、それがどのように順序付けされるべきかを知っています。

Comparator自然な順序付けのないオブジェクト、または別の順序付けを使用したいオブジェクト用です。


3

ComparatorインタフェースとComparableインタフェースの違い

Comparable他のオブジェクトと使用して自分自身を比較するために使用されます。

Comparator2つのデータ型がオブジェクトであることを比較するために使用されます。


2

あなたが見るならば、これら二つの間の論理的な違いはComparatorJavaでは、彼に提供された2つのオブジェクトを比較します。Comparableインタフェースは "this"参照を指定されたオブジェクトと比較します。

ComparableJavaでは、オブジェクトの自然順序付けを実装するために使用されます。 Java API Stringでは、Dateクラスとwrapperクラスが実装しています。Comparableインタフェース。

いずれかのクラスが実装している場合ComparableJavaのインタフェースそれからそのオブジェクトのコレクションListまたはArrayを使用して自動的にソートすることができますCollections.sort()またはArray.sort()メソッドとオブジェクトは、で定義された自然順序に基づいてソートされます。compareTo方法。

実装するオブジェクトComparableJavaでは、ソートマップのキーまたはソートセットの要素として使用できます。TreeSet何も指定せずにComparator


0

ComparableとComparatorを実装するための私のアノテーションlib:

public class Person implements Comparable<Person> {         
    private String firstName;  
    private String lastName;         
    private int age;         
    private char gentle;         

    @Override         
    @CompaProperties({ @CompaProperty(property = "lastName"),              
        @CompaProperty(property = "age",  order = Order.DSC) })           
    public int compareTo(Person person) {                 
        return Compamatic.doComparasion(this, person);         
    }  
} 

他の例を見るにはリンクをクリックしてください。気軽な


  • stackoverflowへようこそ。この質問は古く、すでに回答されています。一般的に、あなたの返答が以前の返答と比べてかなり新しいものや違うものを提供しない限り、古いスレッドを復活させないことが最善です。 - oers

リンクされた質問


関連する質問

最近の質問