0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Comparatorを使った複数条件のソート

Posted at

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;
	}
}

並び替えは以下の仕様で行ってみます。

仕様

  1. 最初にDateEの昇順で並べる、nullの場合は後ろ
  2. 次に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]

適当ですが目的は達成できました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?