では「ランキングを返却(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 とスコア抽出関数を渡せばどんな型でもランキング可能。
- 再利用性: 共通ユーティリティとしてプロジェクト全体で使える。
- テスト容易性: 戻り値を検証するだけで単体テスト可能。
