データベースから取得した結果リスト(例えば List<Entity>)を 複数キーでソートする方法を解説します。実務では「部署 → 年齢 → 名前」や「日付 → 金額」など複数条件で並べ替えることがよくあります。
基本の考え方
Java では Comparator を使って複数キーでソートできます。
- Stream API の
.sorted() - Collections.sort() と
Comparator - Comparator.comparing()
+thenComparing()` の組み合わせ
サンプルコード(社員リストをソート)
例: 社員クラス
class Employee {
String department;
int age;
String name;
Employee(String department, int age, String name) {
this.department = department;
this.age = age;
this.name = name;
}
@Override
public String toString() {
return department + " - " + age + " - " + name;
}
}
Java複数キーでソート
import java.util.*;
public class MultiKeySortExample {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Sales", 30, "Tanaka"),
new Employee("HR", 25, "Sato"),
new Employee("Sales", 25, "Suzuki"),
new Employee("HR", 30, "Kato"),
new Employee("Sales", 30, "Ando")
);
// 部署 → 年齢 → 名前 の順でソート
employees.sort(
Comparator.comparing((Employee e) -> e.department)
.thenComparing(e -> e.age)
.thenComparing(e -> e.name)
);
employees.forEach(System.out::println);
}
}
Java出力例
HR - 25 - Sato
HR - 30 - Kato
Sales - 25 - Suzuki
Sales - 30 - Ando
Sales - 30 - Tanaka
Stream API を使う場合
employees.stream()
.sorted(
Comparator.comparing((Employee e) -> e.department)
.thenComparing(e -> e.age)
.thenComparing(e -> e.name)
)
.forEach(System.out::println);
Java応用ポイント
- 昇順/降順の切り替え
Comparator.comparing(Employee::getAge).reversed() - 数値や日付の比較
Comparator.comparingLong()やComparator.comparingInt()を使うと効率的。 - 複合条件
thenComparing()を重ねることで「部署 → 年齢 → 名前 → 日付」など自由に組み合わせ可能。
💡 まとめ
- Comparator.comparing + thenComparing が複数キーソートの基本。
- Stream API を使うと宣言的に書けて読みやすい。
- 実務では「部署 → 日付 → ID」など複合条件が頻出。
