1. 概要

このチュートリアルでは、リスト内のオブジェクトを日付で並べ替える方法について説明します。 ほとんどの並べ替え手法または例では、ユーザーはリストをアルファベット順に並べ替えることができますが、この記事では、Dateオブジェクトを使用して並べ替える方法について説明します。

リストの値カスタムソートするためにJavaのComparatorクラスを使用する方法を見ていきます。

2. 設定

この記事で使用するEmployeeエンティティを見てみましょう。

public class Employee implements Comparable<Employee> {

    private String name;
    private Date joiningDate;

    public Employee(String name, Date joiningDate) {
        // ...
    }

    // standard getters and setters
}

EmployeeクラスにComparableインターフェイスを実装したことがわかります。 このインターフェイスを使用すると、オブジェクトを同じタイプの他のオブジェクトと比較するための戦略を定義できます。 これは、オブジェクトを自然順序付け形式でソートするため、またはcompareTo()メソッドによって定義されるために使用されます。

3. Compareableを使用した並べ替え

Javaでは、自然な順序とは、配列またはコレクション内のプリミティブまたはオブジェクトを並べ替える方法を指します。 java.util.Arraysとjava.util.Collectionsのsort()メソッドは一貫性があり、同等性のセマンティクスを反映している必要があります。

現在のオブジェクトと引数として渡されたオブジェクトを比較するために、このメソッドを使用します。

public class Employee implements Comparable<Employee> {
    
    // ...

    @Override
    public boolean equals(Object obj) {
        return ((Employee) obj).getName().equals(getName());
    }

    @Override
    public int compareTo(Employee employee) {
        return getJoiningDate().compareTo(employee.getJoiningDate());
    }
}

このcompareTo()メソッドは、現在のオブジェクトをパラメーターとして送信されているオブジェクトと比較します。上記の例では、現在のオブジェクトの結合日を渡されたEmployeeオブジェクト。

3.1. 昇順で並べ替え

ほとんどの場合、 compareTo()メソッドは、自然ソートを使用したオブジェクト間の比較のロジックを記述します。ここでは、従業員の参加日フィールドを同じタイプの他のオブジェクトと比較します。 参加日が同じ場合、2人の従業員は0を返します。

@Test
public void givenEmpList_SortEmpList_thenSortedListinNaturalOrder() {
    Collections.sort(employees);
    assertEquals(employees, employeesSortedByDateAsc);
}

これで、 Collections.sort(employees)は、主キーまたは名前ではなく、joiningDateに基づいて従業員リストを並べ替えます。 リストが従業員のjoiningDateでソートされていることがわかります。これは、Employeeクラスの自然な順序になります。

[(Pearl,Tue Apr 27 23:30:47 IST 2021),
(Earl,Sun Feb 27 23:30:47 IST 2022),
(Steve,Sun Apr 17 23:30:47 IST 2022),
(John,Wed Apr 27 23:30:47 IST 2022)]

3.2. 降順で並べ替え

Collections.reverseOrder()メソッドはオブジェクトを並べ替えますが、自然順序付けによって課せられた逆の順序になります。これは、逆の順序を実行するコンパレータを返します。 オブジェクトが比較でnullを返すと、NullPointerExceptionがスローされます。

@Test
public void givenEmpList_SortEmpList_thenSortedListinDescOrder() {
    Collections.sort(employees, Collections.reverseOrder());
    assertEquals(employees, employeesSortedByDateDesc);
}

4. コンパレータを使用した並べ替え

4.1. 昇順で並べ替え

次に、コンパレータインターフェイスの実装を使用して、従業員リストを並べ替えます。 ここでは、匿名の内部クラスパラメータをオンザフライで Collections.sort()APIに渡します。

@Test
public void givenEmpList_SortEmpList_thenCheckSortedList() {

    Collections.sort(employees, new Comparator<Employee>() {
        public int compare(Employee o1, Employee o2) {
            return o1.getJoiningDate().compareTo(o2.getJoiningDate());
        }
    });

    assertEquals(employees, employeesSortedByDateAsc);
}

以下に示すように、この構文をJava8Lambda構文に置き換えることもできます。これによりコードがはるかに小さくなります。

@Test
public void givenEmpList_SortEmpList_thenCheckSortedListAscLambda() {

    Collections.sort(employees, Comparator.comparing(Employee::getJoiningDate));

    assertEquals(employees, employeesSortedByDateAsc);
}

compare(arg1、arg2)メソッドは、ジェネリック型の2つの引数を取り、整数を返します。クラス定義から分離されているため、異なるものに基づいてカスタム比較を定義できます。変数とエンティティ。 これは、引数オブジェクトを比較するための別のカスタムソートを定義する場合に役立ちます。

4.2. 降順で並べ替え

従業員オブジェクトの比較を逆にする、つまりEmployee2Employee1と比較することにより、指定されたEmployeeリストを降順で並べ替えることができます。 これにより、比較が逆になり、結果が降順で返されます。

@Test
public void givenEmpList_SortEmpList_thenCheckSortedListDescV1() {

    Collections.sort(employees, new Comparator<Employee>() {
        public int compare(Employee emp1, Employee emp2) {
            return emp2.getJoiningDate().compareTo(emp1.getJoiningDate());
        }
    });

    assertEquals(employees, employeesSortedByDateDesc);
}

Java 8 Lambda式を使用して、上記のメソッドをより簡潔な形式に変換することもできます。 これは上記の関数と同じ機能を実行しますが、上記のコードと比較してコードに含まれるコードの行が少ないという唯一の違いがあります。 ただし、これによりコードが読みにくくなります。 Comparatorを使用している間、 Collections.sort()APIの匿名内部クラスをオンザフライで渡します。

@Test
public void givenEmpList_SortEmpList_thenCheckSortedListDescLambda() {

    Collections.sort(employees, (emp1, emp2) -> emp2.getJoiningDate().compareTo(emp1.getJoiningDate()));
    assertEquals(employees, employeesSortedByDateDesc);
}

5. 結論

この記事では、昇順モードと降順モードの両方で、JavaコレクションをDateオブジェクトで並べ替える方法について説明しました。

また、並べ替えに役立ち、コードを簡潔にするのに役立つJava8ラムダ機能についても簡単に説明しました。

いつものように、この記事で使用されている完全なコード例は、GitHubにあります。