JavaでList< 独自クラス>をソートする方法をメモしておきます。
今回は無名クラスを作成してComparatorインターフェースを実装し、その中でcompareメソッドをオーバーライドしてソートする方法をご紹介します。
下記サンプルソースではソート用メソッドへ引数を指定する事で昇順、降順を指定出来るようにしています。
Javaソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
/** * <p>[概 要] SampleBean。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * <p>[環 境] </p> */ public class SampleBean { /** * 番号 */ private Integer no; /** * データ */ private String data; /** * <p>[概 要] 番号を取得する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @return 番号 */ public Integer getNo() { return no; } /** * <p>[概 要] 番号を設定する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param no 番号 */ public void setNo(Integer no) { this.no = no; } /** * <p>[概 要] データを取得する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @return データ */ public String getData() { return data; } /** * <p>[概 要] データを設定する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param data データ */ public void setData(String data) { this.data = data; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/** * <p>[概 要] ソート</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param targetlist ソート対象リスト * @param sortType ソート種別(1:昇順, -1:降順) * @return ソート後リスト */ public static List<SampleBean> sort(List<SampleBean> targetlist, final int sortType) { Collections.sort(targetlist, new UtilSortComp().setSortType(sortType)); return targetlist; } private static final class UtilSortComp implements Comparator<SampleBean> { int sortType = 1; public UtilSortComp setSortType(int sortType) { this.sortType = sortType; return this; } @Override public int compare(SampleBean bean1, SampleBean bean2) { if (bean1 == null && bean2 == null) { return 0; } else if (bean1 == null) { return 1 * sortType; } else if (bean2 == null) { return -1 * sortType; } return bean1.getData().compareTo(bean2.getData()) * sortType; } |
文字列のフィールドでソートする場合、compareToメソッドではUNICODEで判定する為、全角文字(漢字や特殊文字)が含まれる場合は想定通りにソートされない可能性があります。
上記サンプルでは文字列のフィールドでソートしていますが、「UtilSample1.java」の30行目を以下の様に変更すれば数値型の項目でもソート出来ます。
1 |
return bean1.getNo() - bean2.getNo() * sortType; |
JUnitサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
@Test public void sortTest() { // 準備 SampleBean bean1 = new SampleBean(); bean1.setNo(1); bean1.setData("B001"); SampleBean bean2 = new SampleBean(); bean2.setNo(2); bean2.setData("C001"); SampleBean bean3 = new SampleBean(); bean3.setNo(3); bean3.setData("A001"); List<SampleBean> paramList1 = new ArrayList<SampleBean>(); paramList1.add(bean1); paramList1.add(bean2); paramList1.add(bean3); List<SampleBean> paramList2 = new ArrayList<SampleBean>(); paramList2.addAll(paramList1); // 期待値<昇順ソート> List<SampleBean> expectedList1 = new ArrayList<SampleBean>(); expectedList1.add(bean3); expectedList1.add(bean1); expectedList1.add(bean2); // 期待値<降順ソート> List<SampleBean> expectedList2 = new ArrayList<SampleBean>(); expectedList2.add(bean2); expectedList2.add(bean1); expectedList2.add(bean3); // 実行 List<SampleBean> result1 = UtilSample1.sort(paramList1, 1); List<SampleBean> result2 = UtilSample1.sort(paramList2, -1); // 検証 assertEquals("リスト1のソート順が一致していません。", expectedList1, result1); for(SampleBean resultBean1 : result1) { System.out.println(resultBean1.getData()); } assertEquals("リスト2のソート順が一致していません。", expectedList2, result2); for(SampleBean resultBean2 : result2) { System.out.println(resultBean2.getData()); } } |
JUnit実行後のコンソール
1 2 3 4 5 6 |
A001 B001 C001 C001 B001 A001 |