Javaでコンパレータを使用したコレクションのソート方法


  1. Comparableインターフェースを実装する方法:

    • ソートしたいクラスにComparableインターフェースを実装します。
    • ComparableインターフェースのcompareToメソッドをオーバーライドし、要素の比較ロジックを実装します。
    • コレクションをソートする際に、Collections.sortメソッドを使用します。

    以下は、Personクラスを名前のアルファベット順にソートする例です:

    import java.util.ArrayList;
    import java.util.Collections;
    public class Person implements Comparable<Person> {
       private String name;
       public Person(String name) {
           this.name = name;
       }
       public String getName() {
           return name;
       }
       @Override
       public int compareTo(Person person) {
           return this.getName().compareTo(person.getName());
       }
       public static void main(String[] args) {
           ArrayList<Person> people = new ArrayList<>();
           people.add(new Person("Alice"));
           people.add(new Person("Bob"));
           people.add(new Person("Charlie"));
           Collections.sort(people);
           for (Person person : people) {
               System.out.println(person.getName());
           }
       }
    }

    出力結果:

    Alice
    Bob
    Charlie
  2. Comparatorインターフェースを使用する方法:

    • ソートしたいクラスにComparatorインターフェースを実装しない場合や既存の比較ロジックをオーバーライドしたくない場合、Comparatorを使用することができます。
    • Comparatorインターフェースのcompareメソッドを実装し、要素の比較ロジックを提供します。
    • コレクションをソートする際に、Collections.sortメソッドの引数としてComparatorオブジェクトを渡します。

    以下は、Personクラスを年齢の昇順にソートする例です:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    public class Person {
       private String name;
       private int age;
       public Person(String name, int age) {
           this.name = name;
           this.age = age;
       }
       public String getName() {
           return name;
       }
       public int getAge() {
           return age;
       }
       public static void main(String[] args) {
           ArrayList<Person> people = new ArrayList<>();
           people.add(new Person("Alice", 25));
           people.add(new Person("Bob", 30));
           people.add(new Person("Charlie", 20));
           Collections.sort(people, new Comparator<Person>() {
               @Override
               public int compare(Person person1, Person person2) {
                   return Integer.compare(person1.getAge(), person2.getAge());
               }
           });
           for (Person person : people) {
               System.out.println(person.getName());
           }
       }
    }

    出力結果:

    Charlie
    Alice
    Bob

これらの方法を使用することで、Javaでコンパレータを使ってコレクションをソートすることができます。適切なインターフェースを実装するか、Comparatorオブジェクトを作成することで、要素のソート順をカスタマイズすることができます。