見出し画像

Java :2つのオブジェクトを定義して並び変える(compare)

compare メソッドは、Comparator や Comparable インターフェースを使用して、オブジェクト間の順序を比較するために使います。具体的には、compare メソッドは2つのオブジェクトを比較して、それらの相対的な順序を定義します。compare メソッドを利用することで、Javaでのオブジェクトのカスタムソートを実現できます。

Comparable インターフェースの compareTo メソッド

Comparable インターフェースを実装するクラスは、オブジェクト自身のソート順序を定義できます。そのためには、compareTo メソッドをオーバーライドします。

使い方の例 (Comparable の compareTo)

compareTo メソッドを使ってオブジェクトを自然順序でソートする例です。自然順序とは「小さい順」「昇順」のことです。
compare の使い方のポイント

  1. 引数:

    • compare(T o1, T o2) は2つのオブジェクト o1 と o2 を比較します。

  2. 戻り値:

    • o1 が o2 より小さい場合は負の値を返します。

    • o1 と o2 が等しい場合は 0 を返します。

    • o1 が o2 より大きい場合は正の値を返します。

  3. 複数の条件でソート:

    • 条件が複数ある場合、if-else ブロックや三項演算子を使って比較順序を決定します。


例えば、Person クラスを年齢で比較してソートする場合:

class Person implements Comparable<Person> {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // compareToメソッドをオーバーライドして、年齢で比較
    @Override
    public int compareTo(Person other) {
        return this.age - other.age;  // 年齢が小さい順にソート
    }

    @Override
    public String toString() {
        return this.name + " (" + this.age + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 28));

        // ComparableのcompareToを使ってソート
        Collections.sort(people);

        // ソート結果を出力
        for (Person p : people) {
            System.out.println(p);
        }
    }
}

上記の例では、compareTo メソッドを使って Person クラスのオブジェクトを年齢の昇順に並べています。


Comparator インターフェースの compare メソッド

Comparator インターフェースは、クラスの外からオブジェクトの順序を指定したい場合に使います。この場合、compare メソッドを実装して比較ルールを定義します。

使い方の例 (Comparator の compare)

次に、Comparator を使用して異なるフィールド(例えば名前)で Person クラスのオブジェクトをソートする例を見てみましょう。

import java.util.*;

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return this.name + " (" + this.age + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 28));

        // 名前で比較するComparatorを定義
        Comparator<Person> nameComparator = new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return p1.name.compareTo(p2.name);  // 名前で比較
            }
        };

        // 名前順にソート
        Collections.sort(people, nameComparator);

        // ソート結果を出力
        for (Person p : people) {
            System.out.println(p);
        }
    }
}

この例では、Comparator を使用して名前順に Person オブジェクトをソートしています。


複数条件で compare を使う例

たとえば、次のように複数条件でソートする場合を考えます。まず銀の量が多い順に並び、銀の量が同じなら金の量で並び替えるという例です。

import java.util.*;

class Person {
    int gold;
    int silver;

    Person(int gold, int silver) {
        this.gold = gold;
        this.silver = silver;
    }

    @Override
    public String toString() {
        return "Gold: " + this.gold + ", Silver: " + this.silver;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person(10, 50));
        people.add(new Person(30, 50));
        people.add(new Person(20, 30));

        // 銀が多い順、同じ銀の場合は金が多い順に並べるComparator
        Comparator<Person> comparator = new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                if (p1.silver != p2.silver) {
                    return p2.silver - p1.silver;  // 銀の量で降順
                } else {
                    return p2.gold - p1.gold;      // 銀が同じなら金の量で降順
                }
            }
        };

        // ソート実行
        Collections.sort(people, comparator);

        // 結果を表示
        for (Person p : people) {
            System.out.println(p);
        }
    }
}

上記のコードでは、銀の量が多い順でソートし、銀の量が同じ場合には金の量が多い順にソートしています。


まとめ

  • Comparable は、オブジェクト自体に順序を定義するために compareTo メソッドを実装します。

  • Comparator は、外部から順序を指定するために compare メソッドを実装します。

  • どちらの方法でも、オブジェクトのソート基準をカスタマイズすることが可能です。

  • Java 8 以降は、Comparator を使う際にラムダ式でより簡潔に記述することもできます。

この記事が気に入ったらサポートをしてみませんか?