8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java】nullを考慮しつつ複数キーでソートする

Last updated at Posted at 2019-05-27

案外詰まったので備忘用に残します。

やること

IDを3種類持つオブジェクトについて、以下のようにソートします。

  • id1 -> id2 -> id3」の順でそれぞれソートする
  • ソートは全て昇順(NaturalOrder)で行う
    • ただし、全てのソートでnullは最後とする

ソース

// import類
import static java.util.Comparator.comparing;
import static java.util.Comparator.naturalOrder;
import static java.util.Comparator.nullsLast;

/* 略 */

static void sortIdObject(List<IdObject> idObjects) {
  idObjects.sort(
      comparing(IdObject::getId1, nullsLast(naturalOrder()))
          .thenComparing(IdObject::getId2, nullsLast(naturalOrder()))
          .thenComparing(IdObject::getId3, nullsLast(naturalOrder()))
  );
}

解説

id1 -> id2 -> id3」の順でそれぞれソートする

この部分は、比較をcomparing(xxx).thenComparing(xxx).thenComparing...と繋いでいくことで実現できます。

ただし、全てのソートでnullは最後とする

今回はnullが最後なのでnullsLast([Comparator])で囲いました。
そもそも、用意されているcomparatornullを入れるとヌルポになるため、nullableな内容を比較する場合はnullsLastnullsFirstで囲ってやる必要があります。
また、nullsLast/Firstで囲ったとしても、compareIntなどのプリミティブ型に関する比較系はヌルポになるため注意が必要です。

ソートは全て昇順(NaturalOrder)で行う

ComparatornaturalOrder()を指定することで実現できます。
逆順だとreverseOrder()を指定することで実現できます。

補足

今回並び替えるオブジェクト

// ゲッターはLombokによる生成を想定
@Getter
public class IdObject {
  private Integer id1;
  private Integer id2;
  private Integer id3;
}

参考にさせていただいた内容

8
9
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
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?