Udemyの人気コースが今なら80%OFF!

【Java入門】StreamAPI 並び替え(sortedメソッドの使い方)

【Java入門】StreamAPI 並び替え(sortedメソッドの使い方)

sortedメソッドとは

sortedメソッドは、中間操作の一つで、ストリーム内の要素を昇順/降順/任意の順に並び替えることができます。

サンプルコード(昇順に並び替える場合)

昇順に並び替えたい場合は、単にsorted()を実行するだけでOKです。

Java

Arrays.asList(200,8,500,300,2000,100,400,50).stream()
    .sorted()
    .forEach(System.out::println);

実行結果

8
50
100
200
300
400
500
2000

また、以下のように.sorted(Comparator.naturalOrder())を指定しても上記と同じ結果を得ることができます。

Java

Arrays.asList(200,8,500,300,2000,100,400,50).stream()
    .sorted(Comparator.naturalOrder())
    .forEach(System.out::println);

サンプルコード(降順に並び替える場合)

降順に並び替えたい場合は.sorted(Comparator.reverseOrder())を指定して実行します。

Java

Arrays.asList(200,8,500,300,2000,100,400,50).stream()
    .sorted(Comparator.reverseOrder())
    .forEach(System.out::println);

実行結果

2000
500
400
300
200
100
50
8

複数条件で任意にソートする方法

複数の項目でソートしたい場合は、以下のように連結して指定します。

Java

Comparator.comparing(column1).thenComparing(column2).thenComparing(column3);

今回は、以下のCEOクラスのデータをソートします。

Java

public class CEO {

    private int age;        //年齢
    private int birthDay;   //誕生日
    private String name;    //名前

    //コンストラクタ
    public CEO(int age, int birthDay, String name) {
        this.age = age;
        this.birthDay = birthDay;
        this.name = name;
    }

    //ゲッター・セッター
    public int getAge() { return age;}
    public void setAge(int age) { this.age = age;}
    public int getBirthDay() { return birthDay;}
    public void setBirthDay(int birthDay) {this.birthDay = birthDay;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}

    @Override
    public String toString(){
        return this.age + ":" + this.birthDay + ":" + this.name;
    }
}

以下は、年齢(降順)、生年月日(降順)、名前(昇順)でソートして出力してみました。降順で並び替えたい項目には.reversed()を指定しています。

Java

//CEOリストの生成
List<CEO> CEOList = new ArrayList<>();

//CEOリストにデータを詰める。
CEOList.add(new CEO(47, 19721029, "Horiemon"));
CEOList.add(new CEO(59, 19601101, "Tim Cook"));
CEOList.add(new CEO(47, 19730326, "Larry Page"));
CEOList.add(new CEO(48, 19720610, "Sundar Pichai"));
CEOList.add(new CEO(36, 19840514, "Mark Zuckerberg"));
CEOList.add(new CEO(49, 19710628, "Elon Musk"));
CEOList.add(new CEO(56, 19640112, "Jeffrey Bezos"));

CEOList.stream()
    //年齢の降順かつ、誕生日の降順に並び替える。
    .sorted(Comparator.comparing(CEO::getAge).reversed()
            .thenComparing(Comparator.comparing(CEO::getBirthDay).reversed()))

    .collect(Collectors.toList())
    .forEach(System.out::println);

実行結果

59:19601101:Tim Cook
56:19640112:Jeffrey Bezos
49:19710628:Elon Musk
48:19720610:Sundar Pichai
47:19730326:Larry Page
47:19721029:Horiemon
36:19840514:Mark Zuckerberg

ラリー・ペイジとホリエモンは同い年なので、誕生日が後ろのラリー・ペイジが上に来ます。
また、以下のように処理を分離して記述することも可能です。

Java

//年齢の降順かつ、誕生日の降順に並び替える。
Comparator<CEO> comparator = Comparator.comparing(CEO::getAge).reversed()
        .thenComparing(Comparator.comparing(CEO::getBirthDay).reversed());

CEOList.stream()
    .sorted(comparator)
    .collect(Collectors.toList())
    .forEach(System.out::println);

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です