Java : Comparable (比較) - API使用例
Comparable (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
このインタフェースを実装する各クラスのオブジェクトに全体順序付けを強制します。 この順序付けはクラスの自然順序付けと呼ばれ、このクラスのcompareToメソッドは自然比較メソッドと呼ばれます。
Comparable インタフェースを実装したクラスは、オブジェクトの大小の比較が可能となります。
主に、Collections.sort や Arrays.sort、Stream.sorted などのソートに使われます。
// StringクラスはComparableを実装しています。
final Comparable<String> comparable = "bbb";
System.out.println(comparable.compareTo("aaa")); // 1
System.out.println(comparable.compareTo("bbb")); // 0
System.out.println(comparable.compareTo("ccc")); // -1
final var list = List.of("ddd", "bbb", "ccc", "aaa");
System.out.println(list); // [ddd, bbb, ccc, aaa]
final var sorted = list.stream().sorted().toList();
System.out.println(sorted); // [aaa, bbb, ccc, ddd]
似たAPIに、Comparatorインタフェースがあります。
Comparableは実装したクラス自体が比較可能になるのに対して、Comparatorは比較対象となるクラスに手を加える必要はありません。
メソッド
int compareTo (T o)
このオブジェクトと指定されたオブジェクトの順序を比較します。このオブジェクトが指定されたオブジェクトより小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数を返します。
// StringクラスはComparableを実装しています。
final var list = List.of("ddd", "bbb", "ccc", "aaa");
System.out.println(list); // [ddd, bbb, ccc, aaa]
final var sorted = list.stream().sorted().toList();
System.out.println(sorted); // [aaa, bbb, ccc, ddd]
独自クラスに実装する例です。
record Sample(String text, int num) implements Comparable<Sample> {
@Override
public String toString() {
return "(%s, %d)".formatted(text, num);
}
@Override
public int compareTo(Sample o) {
// textを優先して比較します。
// もしtextが同じなら、numで大小比較します。
if (!text.equals(o.text())) {
return text.compareTo(o.text());
} else {
return num - o.num();
}
}
}
final var list = List.of(
new Sample("bbb", 2), new Sample("bbb", 3), new Sample("bbb", 1),
new Sample("aaa", 3), new Sample("aaa", 1), new Sample("aaa", 2));
final var sorted = list.stream().sorted().toList();
System.out.println(list); // [(bbb, 2), (bbb, 3), (bbb, 1), (aaa, 3), (aaa, 1), (aaa, 2)]
System.out.println(sorted); // [(aaa, 1), (aaa, 2), (aaa, 3), (bbb, 1), (bbb, 2), (bbb, 3)]
関連記事
コレクション
- API 使用例
- AbstractCollection
- Collection (コレクション)
- Collections (コレクション操作)
- List (リスト)
- Map (マップ)
- Map.Entry (キーと値のペア)
- Queue (キュー)
- AbstractQueue
- ArrayBlockingQueue (ブロッキング・配列キュー)
- ArrayDeque (両端キュー)
- BlockingDeque (ブロッキング・両端キュー)
- BlockingQueue (ブロッキング・キュー)
- ConcurrentLinkedDeque (並列処理用・両端キュー)
- ConcurrentLinkedQueue (並列処理用キュー)
- Deque (両端キュー)
- LinkedBlockingDeque (ブロッキング・リンク両端キュー)
- LinkedBlockingQueue (ブロッキング・リンクキュー)
- LinkedList (二重リンク・リスト)
- PriorityBlockingQueue (ブロッキング・優先度付きキュー)
- PriorityQueue (優先度付きキュー)
- Set (セット)
ストリーム