では「ユーティリティメソッドを使ってランキング表示(トップ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だけ表示、全件表示、フォーマット変更など簡単に切り替え可能。
- テスト容易性: ユーティリティ単位でテストできる。
