【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の実行結果が同じとなりました。


以上となります。

ここまでお読みいただきありがとうございました。

Java

Posted by だゆう