Javaでリストを簡単にソートする

こんにちは、さるまりんです。

Javaによるリストの簡単なソートです。

DBから取得する際にソート済みのものを取ることが多いですが、プログラム内でソートする必要がある時もあるのでメモしておきます。

まずは結論からですがリストは次のようにソートすることができます。

[リスト].sort(Comparator.comparing([ソートのキーとなる値を取得するメソッド]));

実際にやってみます。

作曲家を表すこんなクラスがあります。

/**
 * 作曲家
 */
public class Composer {
    /** 名前 */
    private String name;
    /** 生年 */
    private int yearOfBirth;
    /** 没年 */
    private int yearOfDeath;

    /** constructor */
    public Composer(String name, int yearOfBirth, int yearOfDeath) {
        this.name = name;
        this.yearOfBirth = yearOfBirth;
        this.yearOfDeath = yearOfDeath;
    }

    /* getters */
    public String getName() {
        return name;
    }

    public int getYearOfBirth() {
        return yearOfBirth;
    }

    public int getYearOfDeath() {
        return yearOfDeath;
    }

    public String toString() {
        return "[" + name + ":" + yearOfBirth + "-" + yearOfDeath + "]";
    }
}

要素は名前と生没年です。それぞれにgetterがあり、toString()メソッドも用意しています。

このクラスのオブジェクトを以下のようにリストに詰めてみます。

List<Composer> composers = new ArrayList<Composer>();
composers.add(new Composer("バッハ", 1685, 1750));
composers.add(new Composer("ベートーヴェン", 1770, 1827));
composers.add(new Composer("ブラームス", 1833, 1897));
composers.add(new Composer("モーツァルト", 1756, 1791));
composers.add(new Composer("ショパン", 1810, 1849));
composers.add(new Composer("ワーグナー", 1813, 1883));
composers.add(new Composer("チャイコフスキー", 1840, 1904));
composers.add(new Composer("マーラー", 1860, 1918));
composers.add(new Composer("ドビュッシー", 1862, 1918));
composers.add(new Composer("ショスタコーヴィチ", 1906, 1975));
composers.add(new Composer("ストラヴィンスキー", 1882, 1971));

これを名前でソートするにはComposergetName()なので以下のようにします。

// 名前順にソートします
composers.sort(Comparator.comparing(Composer::getName));

リストを出力するとこうなります。

[[ショスタコーヴィチ:1906-1975], [ショパン:1810-1849], [ストラヴィンスキー:1882-1971], [チャイコフスキー:1840-1904], [ドビュッシー:1862-1918], [バッハ:1685-1750], [ブラームス:1833-1897], [ベートーヴェン:1770-1827], [マーラー:1860-1918], [モーツァルト:1756-1791], [ワーグナー:1813-1883]]

名前順になってますね。

生年順にしてみます。

// 生年順にソートします
composers.sort(Comparator.comparing(Composer::getYearOfBirth));
[[バッハ:1685-1750], [モーツァルト:1756-1791], [ベートーヴェン:1770-1827], [ショパン:1810-1849], [ワーグナー:1813-1883], [ブラームス:1833-1897], [チャイコフスキー:1840-1904], [マーラー:1860-1918], [ドビュッシー:1862-1918], [ストラヴィンスキー:1882-1971], [ショスタコーヴィチ:1906-1975]]

没年順にしてみます。

// 没年順にソートします
composers.sort(Comparator.comparing(Composer::getYearOfDeath));
[[バッハ:1685-1750], [モーツァルト:1756-1791], [ベートーヴェン:1770-1827], [ショパン:1810-1849], [ワーグナー:1813-1883], [ブラームス:1833-1897], [チャイコフスキー:1840-1904], [マーラー:1860-1918], [ドビュッシー:1862-1918], [ストラヴィンスキー:1882-1971], [ショスタコーヴィチ:1906-1975]]

ちゃんと並んでいますね。

それぞれ昇順で並んでいます。これを逆順にするにはCollectionsreverse()メソッドを使います。

// 名前降順にソートします
composers.sort(Comparator.comparing(Composer::getName));
Collections.reverse(composers);

名前降順でソートされました。

[[ワーグナー:1813-1883], [モーツァルト:1756-1791], [マーラー:1860-1918], [ベートーヴェン:1770-1827], [ブラームス:1833-1897], [バッハ:1685-1750], [ドビュッシー:1862-1918], [チャイコフスキー:1840-1904], [ストラヴィンスキー:1882-1971], [ショパン:1810-1849], [ショスタコーヴィチ:1906-1975]]

Comparatorを実装したクラスで比較するロジックを作ってやる方法もあるのですが、シンプルなものだとこのcomparingを使うだけで実現できたのでとても簡単でした。

読んでくださってありがとうございました。

それではまた!