ComparableとComparatorの違いは何か
ComparableとComparatorの違いを混同していた。
自分用のラフなメモ書き。
【参考】
Java:任意の順番でのソート ? サイゼントの技術ブログ
compareToでJavaのソートは自由自在! 一からお伝えします
Java - オブジェクトの比較(==、equals、Comparable、Comparator)
Java Comparatorメモ(Hishidama's Java Comparator Memo)
結論は、
java.lang.Comparableは、Arrays.sort(Object[]), Collections.sort(List)で使う。
ソートを行いたいクラスにComparatorを明示的に実装する場合に使われる。
java.util.Comparatorは、ラムダ式やstream.sorted()で使う。
Comparatorは、ソートしたいクラスからソートのロジック部分を分離したいときに使われる。
違いは、Comparatorインターフェイスではなく、Comparatorはオブジェクトとして作成する。
class Book implements Comparable
処理の中で自分のクラス(Book)のソート順を定義します。
comparaTo()をオーバーライドして定義します。
//java.lang.Comparableは、自分のクラスと比較してソートする
public class Book implements Comparable
// タイトル
private String title;
// 値段
private int price;
// 発行日
private LocalDate dateOfIssue;
@Override
public int compareTo(Book book){
return title.compareTo(book.title);
}
}
Collections.sort(bookList);
つまり、Comparableを格納しているListをソートする際は、Collections.sort(List)/reverse(List)を使うのが基本。
AA.compareTo(BB) => java.lang.Comparable を連想する。
たとえば、String#compareTo(String)、Integer#compareTo(Integer)になる。
Comparable.compareToのコツは、判断結果は小さい・等しい・大きいの3種類だけ。
値や文字列が等しいか、どちらが大きいかを判断するだけ。
オブジェクトや文字列や数値のListやSetを直接ソートしたい場合は、Comparableを継承して、compareToメソッドを実装する。
その方が楽。
一方、class BookTitleComparator(ソート用クラス) implements Comparator
処理の中で何かのクラス(ソートさせたいクラス)のソート順を定義します。
compare()をオーバーライドして定義します。
//java.util.Comparatorは、任意のクラスをソートできる
public class BookTitleComparator implements Comparator
@Override
public int compare(Book book1, Book book2){
return book1.getTitle().compareTo(book2.getTitle());
}
}
bookList.sort(new BookTitleComparator());
または
bookList.sort((book1, book2) -> book1.getTitle().compareTo(book2.getTitle()));
ストリームAPIでは、基本はComparatorを使う場合が多い。
なぜなら、ソート処理にラムダ式を頻繁に使うから。
こんなことを調べてみると、ComparableはComparatorよりも古いAPIなのだろう。
Java8以後でラムダ式が生まれたので、Comparatorはその後に定義されたのだろう。
実際、java.lang.Comparableなので、import文は不要。
一方、java.util.Comparatorなので、必ずimport文は必要になる。
| 固定リンク
「Java」カテゴリの記事
- パッケージ原則とクラス原則の違いは何なのか(2023.10.14)
- パッケージ設計の原則の意義は変化しているのか(2023.09.30)
- ChatGPTにEclipseでEclEmmaとJaCoCoからカバレッジを出力する方法を聞いた(2023.02.01)
- JavaGold SE11の感想(2022.12.25)
- ComparableとComparatorの違いは何か(2022.11.20)
コメント