【Java】リストをComparatorインターフェースを使用してソートする
複数条件のソートにも対応していきます。
【Java】リストをComparatorインターフェースを使用してソート
やりたいこと
画像の左側をJavaの初期のリストの状態とし、そのリストを日付(昇順), 値段(降順), 名前(昇順)でソートしたい。
というのが今回やりたいことです。

ソートの方法はいろいろありますが、今回はComparatorインターフェースを使って実現していきます。
今回使用した環境
インターネット接続可能のオンラインの環境
64 ビット オペレーティング システム
Windows 10 22H2
Java 17
ソースコード
まずは1件の売上を表すクラスです。
import java.math.BigDecimal;
import java.time.LocalDate;
public class Uriage {
private LocalDate hiduke; // 日付
private String namae; // 名前
private BigDecimal nedan; // 値段
public Uriage(LocalDate hiduke, String namae, BigDecimal nedan) {
this.hiduke = hiduke;
this.namae = namae;
this.nedan = nedan;
}
public LocalDate getHiduke() {
return hiduke;
}
public void setHiduke(LocalDate hiduke) {
this.hiduke = hiduke;
}
public String getNamae() {
return namae;
}
public void setNamae(String namae) {
this.namae = namae;
}
public BigDecimal getNedan() {
return nedan;
}
public void setNedan(BigDecimal nedan) {
this.nedan = nedan;
}
}
次にソートを行うクラスです。
最初に売り上げオブジェクトのリストを作成し、その後にソート、結果をコンソールに出力を行っています。
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class SortMain {
public static void main(String[] args) {
// 売上オブジェクトの生成
var u1 = new Uriage(LocalDate.of(2025, 1, 4), "みかん", new BigDecimal(300));
var u2 = new Uriage(LocalDate.of(2024, 12, 26), "りんご", new BigDecimal(300));
var u3 = new Uriage(LocalDate.of(2024, 12, 26), "りんご", new BigDecimal(400));
var u4 = new Uriage(LocalDate.of(2025, 1, 4), "ぶどう", new BigDecimal(500));
var u5 = new Uriage(LocalDate.of(2024, 12, 26), "みかん", new BigDecimal(300));
var u6 = new Uriage(LocalDate.of(2025, 1, 4), "みかん", new BigDecimal(250));
var u7 = new Uriage(LocalDate.of(2025, 1, 4), "りんご", new BigDecimal(500));
// 売上オブジェクトインスタンスをリストに追加
List<Uriage> uriageList = new ArrayList<Uriage>();
uriageList.add(u1);
uriageList.add(u2);
uriageList.add(u3);
uriageList.add(u4);
uriageList.add(u5);
uriageList.add(u6);
uriageList.add(u7);
// ソート条件
Comparator<Uriage> comp = Comparator.comparing(Uriage::getHiduke).reversed()
.thenComparing(Uriage::getNedan).reversed()
.thenComparing(Uriage::getNamae);
// ソート実施
List<Uriage> sortedList = uriageList.stream().sorted(comp).toList();
// 結果出力
for (Uriage u : sortedList) {
System.out.println(u.getHiduke().toString() + ", " +
u.getNamae() + ", " +
u.getNedan().toString());
}
}
}
ちょっと気になるコーディングとしては31行目の
Comparator comp = Comparator.comparing(Uriage::getHiduke).reversed()
ですね。日付は昇順でソートしたいのに「reversed()」を付けないと昇順とならなかったのが腑に落ちないです。もし「reversed()」を消して実行すると降順となってしまいます。
日付項目の場合、ソートが逆になるのか…?
もし考えが間違っていたらすみません。ただやりたい動きは実現できそうです。
動作確認
実行結果を以下に貼りました。

想定していた結果と実際のJavaの実行結果が同じとなりました。
以上となります。
ここまでお読みいただきありがとうございました。