Comparableインターフェースとは
下記はAPIドキュメント
public interface Comparable
このインタフェースを実装する各クラスのオブジェクトに全体順序付けを強制します。この順序付けはクラスの自然順序付けと呼ばれ、このクラスのcompareToメソッドは自然比較メソッドと呼ばれます
Javaのクラスが自然な順序付けをサポートするために実装するインタフェースである。自然な順序付けとは、オブジェクト間の大小関係を定義することを意味する。
位置付けとしてはクラス(オブジェクト)の共通メソッドであるがequalsやtoStringなどと違い、他と違ってComparableはObjectには宣言されていない。
必要に応じてクラス作成時に実装し、抽象メソッドであるcompareTo()メソッドをオーバーライドしなければならない。このメソッドは、自身のオブジェクトと引数として与えられた他のオブジェクトとの比較結果を返す
Comparableを実装せずに自然順序付けに従ってソート実行しようとすると"ClassCastException"が発生する
compareTo()メソッドの戻り値
- 負の整数:自身のオブジェクトが引数よりも小さいことを示す。
- 0:自身のオブジェクトが引数と等しいことを示す。
- 正の整数:自身のオブジェクトが引数よりも大きいことを示す。
例
import java.time.LocalDate;
public class Shose implements java.lang.Comparable<Shose> {
public Integer price;
public String name;
public LocalDate dateOfIssue;
Shose(Integer price, String name, LocalDate dateOfIssue){
this.price = price;
this.name = name;
this.dateOfIssue = dateOfIssue;
}
@Override
public int compareTo(Shose shose){ // Comparableの抽象メソッド
return this.price.compareTo(shose.price); // 自分自身と引数を比べる
}
}
<並び替えを行うMainクラス>
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws Exception {
// ソート対象の作成
List<Shose> shoseList = new ArrayList<>();
shoseList.add(new Shose(8710, "jordan",LocalDate.of(1985,9,15)));
shoseList.add(new Shose(10000, "Super Star",LocalDate.of(1969,4,1)));
shoseList.add(new Shose(7700, "ALL STAR", LocalDate.of(1917,4,2)));
// ソート実行
Collections.sort(shoseList);
// priceの値の昇順ソート対象を表示する
shoseList.forEach( s -> System.out.println(s.price + ":" + s.name + ":" + s.da));
}
}
処理結果
// 7700:ALL STAR:1917-04-02
// 8710:jordan:1985-09-15
// 10000:Super Star:1969-04-01
上記の例では、PersonクラスがComparableを実装している。
Comparableインタフェースによって、Shoseオブジェクト同士を値段に基づいて比較することができる。
Mainクラスでは、Shoseオブジェクトを要素とするArrayListを作成し、そのリストをCollections.sort()メソッドを使用して自然順序でソートしている。sort()メソッドは、要素がComparableインタフェースを実装している必要がある。
Comparableの問題点
上記の例のように、Comparableインタフェースを実現したクラスは、compareTo()メソッドにどのような並べ替えをしたいのかというアルゴリズムを記述することができる。
しかし、アルゴリズムを1つしか記述できない(=状況に応じた並べ替えに対応できない)という問題がある。