【Java学習|初心者向け】【Java】ソート順を簡単に入れ替え!Comparator.reversed()の賢い使い方

導入:なぜComparator.reversed()が重要なのか

Javaでリストを並び替える際、数値や文字列を「昇順(小さい順)」から「降順(大きい順)」にしたいことはよくあります。昔は自分で比較ロジックを書き直していましたが、Java 8以降はComparator.reversed()を使うことで、既存の比較ルールをそのまま反転させることができます。コードの可読性を高め、保守性を向上させるために必須のテクニックです。

基礎知識:Comparatorとは何か

Comparatorは、Javaにおいて「オブジェクトをどのように比較して並べるか」というルールを定義するインターフェースです。例えば、名前で並べるのか、年齢で並べるのか、といった基準を定義します。
reversed()は、そのインターフェースが持つメソッドの一つで、既に定義された比較ルールを「逆にする」働きをします。これにより、わざわざ比較処理を二通り書く必要がなくなります。

実装:Comparator.reversed()の使い方

基本的には、リストやストリームに対してソートを行う際に使用します。
1. まず、基準となる比較ルールを作成します(例:Comparator.comparing(User::getAge))。
2. その後に.reversed()を呼び出すだけで、比較ロジックが反転します。

サンプルプログラム:名前と年齢のソート例

以下は、ユーザーのリストを年齢順でソートし、それを降順(年齢が高い順)に並び替えるコードです。

import java.util.;

public class Main {
    static class User {
        String name;
        int age;

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

    public static void main(String[] args) {
        List users = Arrays.asList(
            new User("田中", 25),
            new User("佐藤", 40),
            new User("鈴木", 30)
        );

        // 1. 年齢の昇順(若い順)でソート
        users.sort(Comparator.comparingInt(u -> u.age));
        
        // 2. 昇順の結果を反転させて、降順(年齢が高い順)にする
        users.sort(Comparator.comparingInt((User u) -> u.age).reversed());

        // 結果を出力
        users.forEach(u -> System.out.println(u.name + ": " + u.age));
    }
}

応用・注意点:現場での活用と陥りやすい罠

注意点1:Nullの扱い
リストの中にnullが含まれている場合、Comparatorを使用するとNullPointerExceptionが発生する可能性があります。現場では、Comparator.nullsFirst()Comparator.nullsLast()を組み合わせて、nullを考慮した安全なソートを心がけましょう。

注意点2:メソッドチェーンの順番
Comparatorを連結させる場合(例:年齢で並べて、同じなら名前で並べる)、.reversed()をどこに付けるかで挙動が変わります。「年齢降順かつ名前昇順」にしたい場合、全体にreversedをかけると名前の順序まで逆転してしまうため、Comparator.comparing(User::getAge).reversed().thenComparing(User::getName)のように、適用範囲を意識して記述することが重要です。

この機能を使いこなせば、複雑なソート処理も数行でスッキリと書けるようになりますよ。ぜひ試してみてください。

コメント

タイトルとURLをコピーしました