目的
Javaのリストをソートしたい。
※データベースからとってくる結果であれば、order byでソートが普通。
画面の項目をソートなど、やむを得ずにJava側でソートしたいときをイメージ。
やりたいこと
配列なりエンティティクラスといった複雑なオブジェクトのリストをソートしたい。
筆者はエンティティクラスをあれこれする機会が多いため、それを例に説明。
イメージ
①画面
「この日は例外的に仕事あるから休みじゃない」
「逆にこの日はモンハン休みだから休みにする」
みたいな感じで独自の祝日を追加したり減らしたあとに
ソートボタンで、ソートできるようにしたい。
②祝日エンティティクラス
public class Holiday {
// 祝日の日付
private String holidayDate;
// 祝日の名前
private String holidayName;
public setHolidayDate(String holidayDate){
this.holidayDate = holidayDate;
}
public setHolidayName(String holidayName){
this.holidayName = holiName;
}
public String getHolidayDate(){
return this.holidayDate;
}
public String getHolidayName(){
return this.HolidayName;
}
}
③祝日フォームクラス
public class SortForm {
// エンティティクラスのリスト
private List<Holiday> holiday = null;
public setHoliday(List<Holiday> holiday){
this.holiday = holiday;
}
public String getHoliday(){
return this.holiday;
}
}
結論
Comparatorのメソッドを作ってあげればよし。
処理クラス
/**
* ソートボタンを押したときの記述をSpringっぽくしてみた
* @param form ソートする画面のフォームクラス
* @return 遷移先
**/
@RequestMapping(value = "sortTabel")
private String sortTabel(SortForm form) {
List<Holiday> holidayList = form.getHoliday();
// ソートする
Collections.sort(holidayList, new HolidayListComparator());
// 画面に移動
return "jsp/hoge/hoge.jsp";
}
/**
* 任意のソートキーを設定
* @return 比較結果
**/
public class HolidayListComparator implements Comparator<Holiday> {
@Override
public int HolidayComparator(Holiday h1, Holiday h2) {
return h1.holidayDate < h2.holidayDate ? -1 : 1;
}
}
あとがき
基本的には、参考記事にあるArrayListのソートと同じことをしている。
テスト画面をサクッと作る必要があって、インナークラスを使いつつ実装。
コーディングのきれいさとやらはガン無視。
3年目くらいのときにふとつまづいたのを思い出したので、コピペと言われればそれまでだが、フェイクを混ぜつつ備忘録として。
参考記事
「ArrayList 要素のソートと Comparator」
https://java.keicode.com/lib/collections-sort.php
「【Java】getter・setterのメモ」
https://qiita.com/takahirocook/items/27828bc8477735612021
「内部クラスの使いどころ」
http://blogs.wankuma.com/nagise/archive/2007/08/01/88273.aspx