Java | ソートをユーティリティメソッドとして再利用化

Java Java
スポンサーリンク

では「ユーティリティメソッドを使ってランキング表示(トップN)を汎用化」する例を作ってみましょう。これで、どんな型のリストでも Comparator を渡せばランキング表示ができるようになります。


サンプルコード

汎用ユーティリティクラス

import java.util.*;
import java.util.stream.*;

public class RankingUtils {

    /**
     * 任意のリストを Comparator に従ってソートし、ランキング形式で表示する
     * @param list ソート対象リスト
     * @param comparator ソート条件
     * @param topN 上位N件だけ表示(N <= 0 の場合は全件表示)
     * @param formatter 表示フォーマッタ(例: e -> e.getName() + "(" + e.getScore() + ")")
     */
    public static <T> void printRanking(List<T> list,
                                        Comparator<? super T> comparator,
                                        int topN,
                                        java.util.function.Function<T, String> formatter) {
        List<T> sorted = list.stream()
                .sorted(comparator)
                .collect(Collectors.toList());

        int limit = (topN > 0) ? Math.min(topN, sorted.size()) : sorted.size();

        for (int i = 0; i < limit; i++) {
            System.out.println((i + 1) + "位: " + formatter.apply(sorted.get(i)));
        }
    }
}
Java

利用例(Employeeクラス)

class Employee {
    private String name;
    private int score;

    public Employee(String name, int score) {
        this.name = name;
        this.score = score;
    }
    public String getName() { return name; }
    public int getScore() { return score; }
}
Java

メインクラス

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Employee> employees = Arrays.asList(
            new Employee("Tanaka", 85),
            new Employee("Sato", 90),
            new Employee("Suzuki", 70),
            new Employee("Kato", 95),
            new Employee("Ando", 80)
        );

        System.out.println("=== 社員ランキング(点数順・トップ3) ===");
        RankingUtils.printRanking(
            employees,
            Comparator.comparingInt(Employee::getScore).reversed(), // 降順
            3, // トップ3だけ
            e -> e.getName() + " (" + e.getScore() + ")"
        );
    }
}

実行例

=== 社員ランキング(点数順・トップ3) ===
1位: Kato (95)
2位: Sato (90)
3位: Tanaka (85)

実務メリット

  • 汎用性: どんな型でも Comparator とフォーマッタを渡せばランキング表示可能。
  • 再利用性: プロジェクト全体で共通のランキング処理を使える。
  • 柔軟性: トップNだけ表示、全件表示、フォーマット変更など簡単に切り替え可能。
  • テスト容易性: ユーティリティ単位でテストできる。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました