ComparatorとComparableのどちらを選択するか

並べ替えを実装するには、並べ替えるオブジェクトを多かれ少なかれ相互に比較できる必要があります。言い換えると、任意の2つのオブジェクトが、指定されたコンテキスト内でどちらが早く、どちらが遅くなるかを示すことができるルールを定義することです。

javaでは、これらのルールは、オブジェクトが属するクラスのレベルで定義されます。たとえば、ユーザーのアカウントを説明するためのクラスを考えてみましょう。

UserAccount {
  currency
  value
  updatedTimestamp
}

コンテキストに応じて、ユーザーアカウントは、次のようなさまざまなルールに従って比較できます。

  • アプリケーションでは、ユーザーには、通貨、次に値でソートされたアカウントが表示されます。

  • 管理パネルでは、すべてのユーザーアカウントが変更日で並べ替えられています。

javaで多かれ少なかれ比較を実装するには、2つの可能性があります。

  • UserAccountはインターフェースを実装しますComparable<UserAccount>。この場合、2つのオブジェクトは互いに比較する機能を取得します。acc1.compareTo(acc2)

  • インターフェイスを実装する別のクラスが作成されComparator<UserAccount>、このクラスのオブジェクトは、元のクラスの2つのオブジェクトを相互に比較できます。userAccountComparator.compare(acc1, acc2)

明らかに、場合によっては、ComparableとComparatorのどちらかを選択することはできません。元のクラスを変更できない場合、または異なる比較ルールが必要な場合は、Comparatorを使用する必要があります。それ以外の場合は、技術的にComparatorとComparableの両方を使用できます。

Comparable , (class's natural ordering). , (String, Date). , . , . ( BigDecimal , 4.0 4.00?). , "" . Comparable.

. , . . : . :

  • : Arrays.sort(accountsList)

  • : Arrays.sort(accountsList, accountByValueComparator)

, compareTo UserAccount, - accountByValueComparator. . .

UserAccount implements Comparable<UserAccount> {
  @Override
  public int compareTo(UserAccount other) { .. }
}

, compareTo ? , Comparable#compareTo, Arrays.sort(). jdk, . : UserAccount Arrays.sort(), stream.sorted() .

コンパレータの明示的な転送の場合、その使用法を見つけることは基本的です。これは、コンパレータを使用するための議論だと思います。(Equals / hashCodeは、暗黙的な使用法を見つけるのが難しいもう1つの例ですが、それらに代わる「Equalator」はありません)。

要約すると、ほとんどの場合、Comparatorを使用するための引数は、Comparableを使用するための引数よりも重要です。




All Articles