SQLでなく、JavaでDTOリストをソートしたい時のサンプルコードです。たまに利用したくなる時があるので、備忘録としてここに残しておきます。Arrays.aslistを用いてリスト生成したものについてはエラーとなるので注意。
Java8から利用できるComparatorでソートするので、それより前の環境ではこの方法は利用できません。とはいえ、あんまりそういった環境で動いてるシステムはないかも知れません。
目次
サンプルコード
DTOクラスと、実際に動かすテストクラスをそれぞれ用意しました。
DTOクラスは社員番号と年齢を保持するシンプルなものにしています。テストクラスにはそのDTOに値をセットして、実際にソートする処理を書いています。
テストソースにも記載していますが、compareToする時に引数に渡すオブジェクトによって、昇順にするか降順にするかを変更することができます。また、対象のDTOリストがnullの場合、ソートに利用する項目がnullの場合はNullPointerExceptionが発生するので、考慮が必要。(空リストは例外発生なし)
importとpackageについてはコード記載してないので、適宜記載してください。
DTOクラス(EmployeeDto)
/**
* 論理名 : 社員情報DTO</br>
*/
public class EmployeeDto {
/** 社員コード */
private String employeeCode;
/** 年齢 */
private Integer age;
/**
* 社員コードを取得
* @return employeeCode
*/
public String getEmployeeCode() {
return employeeCode;
}
/**
* 社員コードを設定
* @param employeeCode
*/
public void setEmployeeCode(String employeeCode) {
this.employeeCode = employeeCode;
}
/**
* 年齢を取得
* @return age
*/
public Integer getAge() {
return age;
}
/**
* 年齢を設定
* @param age
*/
public void setAge(Integer age) {
this.age = age;
}
}
テストクラス(Test)
public class Test {
public static void main(String[] args) {
// テスト用のオブジェクトを作成
List<EmployeeDto> employeeList = new ArrayList<EmployeeDto>();
EmployeeDto employee_1 = new EmployeeDto();
employee_1.setEmployeeCode("201401DK");
employee_1.setAge(32);
employeeList.add(employee_1);
EmployeeDto employee_2 = new EmployeeDto();
employee_2.setEmployeeCode("201402DK");
employee_2.setAge(26);
employeeList.add(employee_2);
EmployeeDto employee_3 = new EmployeeDto();
employee_3.setEmployeeCode("201403DI");
employee_3.setAge(29);
employeeList.add(employee_3);
// DTOクラスの特定項目でのソート開始
Collections.sort(employeeList, new Comparator<EmployeeDto>(){
// Comparatorの参照メソッド
public int compare(EmployeeDto obj1, EmployeeDto obj2) {
/*
* 前後する2つの要素を比較する。
* 第一引数が前のオブジェクトだと、昇順になる。
* 第一引数が後のオブジェクトだと、降順になる。
*/
return obj2.getAge().compareTo(obj1.getAge());
}
});
// ここまでがソート処理
// 検証してみる
for (int i = 0; i < employeeList.size(); i++) {
System.out.println(i+1 + "件目" + "," + "社員コード:" + employeeList.get(i).getEmployeeCode()
+ "," + "年齢:" + employeeList.get(i).getAge());
}
}
}
実行結果
以下がソート結果です。ちゃんとソートできることが分かります。
第一引数が前のオブジェクトの場合(昇順)
1件目,社員コード:201402DK,年齢:26
2件目,社員コード:201403DI,年齢:29
3件目,社員コード:201401DK,年齢:32
第一引数が後のオブジェクトの場合(降順)
1件目,社員コード:201401DK,年齢:32
2件目,社員コード:201403DI,年齢:29
3件目,社員コード:201402DK,年齢:26
まとめ
SQLで全てをやろうとすると煩雑になってしまう場合とかに利用できますね。あと、リスト自体に追加、削除みたいな操作を何度もしなきゃいけないときとかは、最後にこれでソートしてあげることなんかもできます。
割と出番は多そうですね。