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

Java Java
スポンサーリンク

では「ランキングを返却(List<String>)して画面やAPIで利用できる形にする」実務パターンを紹介します。これで、ユーティリティメソッドが 標準出力に直接書き出すのではなく、結果を返却するので、WebアプリやAPIレスポンスに組み込みやすくなります。


汎用ユーティリティクラス(返却型)

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

public class RankingUtils {

    /**
     * 同点処理を含めたランキングを返却する
     * @param list ソート対象リスト
     * @param comparator ソート条件
     * @param topN 上位N件だけ返却(N <= 0 の場合は全件)
     * @param scoreExtractor スコア抽出関数(例: e -> e.getScore())
     * @param formatter 表示フォーマッタ(例: e -> e.getName() + "(" + e.getScore() + ")")
     * @return ランキング結果(List<String>)
     */
    public static <T> List<String> getRankingWithTie(List<T> list,
                                                     Comparator<? super T> comparator,
                                                     int topN,
                                                     java.util.function.ToIntFunction<T> scoreExtractor,
                                                     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();

        List<String> result = new ArrayList<>();

        int rank = 1;
        int prevScore = Integer.MIN_VALUE;
        int displayRank = 1;

        for (int i = 0; i < limit; i++) {
            T item = sorted.get(i);
            int score = scoreExtractor.applyAsInt(item);

            if (score != prevScore) {
                displayRank = rank;
            }
            result.add(displayRank + "位: " + formatter.apply(item));

            prevScore = score;
            rank++;
        }
        return result;
    }
}
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", 90),
            new Employee("Sato", 85),
            new Employee("Suzuki", 90),
            new Employee("Kato", 70),
            new Employee("Ando", 85)
        );

        List<String> ranking = RankingUtils.getRankingWithTie(
            employees,
            Comparator.comparingInt(Employee::getScore).reversed().thenComparing(Employee::getName),
            5,
            Employee::getScore,
            e -> e.getName() + " (" + e.getScore() + ")"
        );

        System.out.println("=== 社員ランキング(同点は同順位・返却型) ===");
        ranking.forEach(System.out::println);
    }
}
Java

実行例

=== 社員ランキング(同点は同順位・返却型) ===
1位: Suzuki (90)
1位: Tanaka (90)
3位: Ando (85)
3位: Sato (85)
5位: Kato (70)

実務メリット

  • 返却型: 標準出力ではなく List<String> を返すので、画面表示や API レスポンスに組み込みやすい。
  • 汎用性: Comparator とスコア抽出関数を渡せばどんな型でもランキング可能。
  • 再利用性: 共通ユーティリティとしてプロジェクト全体で使える。
  • テスト容易性: 戻り値を検証するだけで単体テスト可能。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました