ぽこやかざん雑記

データエンジニア / 下町モルモット / 広島カープファン / 深夜の馬鹿力 / おくやま

Javaの`Comparable`インターフェースとその使用例

とあるクラスのインスタンスが要素となる配列を特定のクラス変数などでソートしたい時のメモ。
その場合はクラスを Comparable インターフェースから実装する。
このインターフェースは、compareTo メソッドをオーバーライドすることでオブジェクト同士の比較が可能。

例として、以下のようなNumberEntityというクラスを考える。

private static class NumberEntity implements Comparable<NumberEntity> {
    int value;

    public NumberEntity(int value) {
        this.value = value;
    }

    @Override
    public int compareTo(NumberEntity other) {
        return this.value - other.value;
    }
}

compareTo メソッドのロジック:

  • このオブジェクトの value が引数として渡されたオブジェクトの value より小さい場合は、0より小さい値を返す
    • sort したらこのオブジェクトは引数として渡されたオブジェクトより前にくる
  • このオブジェクトの value が引数として渡されたオブジェクトの value と等しい場合は、0を返す
  • このオブジェクトの value が引数として渡されたオブジェクトの value より大きい場合は、0より大きい値を返す
    • sort したらこのオブジェクトは引数として渡されたオブジェクトより後にくる

これにより、例えば Collections.sort() メソッドを使って NumberEntity の配列を value の値で並び替えることができる。

実際の使用例

以下は、上述の NumberEntity クラスを使用して、NumberEntityインスタンスを配列として持って並び替える例。

public static void main(String[] args) {
    List<NumberEntity> entities = new ArrayList<>();
    entities.add(new NumberEntity(5));
    entities.add(new NumberEntity(3));
    entities.add(new NumberEntity(8));

    Collections.sort(entities);

    for (NumberEntity entity : entities) {
        System.out.println(entity.value);
    }
    // 出力: 3 5 8
}

Comparableインターフェースを実装することで、オブジェクトの順序を定義し、それを基にして並び替えることが可能。