JavaのリストでComparatorを使った複数条件のソートを行います。
今回は以下のデータクラスのDateSとDateEの2つの日付型で並び替えを行ってみます。
public class MyData {
public int Sort;
public String Name;
public Date DateS;
public Date DateE;
public MyData() { }
public MyData(String name, int sort, Date dates, Date datee) {
this.Sort = sort;
this.Name = name;
this.DateS = dates;
this.DateE = datee;
}
}
並び替えは以下の仕様で行ってみます。
仕様
- 最初にDateEの昇順で並べる、nullの場合は後ろ
- 次にDateEの昇順で並べる、nullの場合は後ろ
ポイント
-
(MyData e)
と型指定をする必要がある - nullを後ろにしたい場合は
Comparator.nullsLast
を利用する - 複数条件は
thenComparing
で繋げる
//バラバラの順番のリストを作成する
List<MyData> myList = new ArrayList<>();
myList.add(new MyData("name1", 1, null, null));
myList.add(new MyData("name2", 2, null, null));
myList.add(new MyData("name3", 3, Date.valueOf(LocalDate.of(2020, 1, 10)), null));
myList.add(new MyData("name4", 4, Date.valueOf(LocalDate.of(2020, 1, 9)),Date.valueOf(LocalDate.of(2020, 1, 9))));
myList.add(new MyData("name5", 5, Date.valueOf(LocalDate.of(2020, 1, 8)),Date.valueOf(LocalDate.of(2020, 1, 8))));
myList.add(new MyData("name6", 6, Date.valueOf(LocalDate.of(2020, 1, 7)),Date.valueOf(LocalDate.of(2020, 1, 7))));
myList.add(new MyData("name7", 7, Date.valueOf(LocalDate.of(2020, 1, 1)),Date.valueOf(LocalDate.of(2020, 1, 1))));
//comparingとthenComparingで複数条件で並び替えを行う
List<MyData> sorted = myList.stream().sorted(
Comparator.comparing((MyData e) -> e.DateE, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing((MyData s) -> s.DateS, Comparator.nullsLast(Comparator.naturalOrder())))
.collect(Collectors.toList());
//表示して確認する
sorted.stream().forEach(f -> System.out.println(f));
結果は以下のようにDateEの次にDateSで並び替えができました。
Name[name7] Sort[7] DateS[2020-01-01] DateE[2020-01-01]
Name[name6] Sort[6] DateS[2020-01-07] DateE[2020-01-07]
Name[name5] Sort[5] DateS[2020-01-08] DateE[2020-01-08]
Name[name4] Sort[4] DateS[2020-01-09] DateE[2020-01-09]
Name[name3] Sort[3] DateS[2020-01-10] DateE[null]
Name[name1] Sort[1] DateS[null] DateE[null]
Name[name2] Sort[2] DateS[null] DateE[null]
適当ですが目的は達成できました。