[Java] 自作エンティティクラスの3種類のソート方法

java

今回は自作クラスをソートする方法を3種類紹介します。

1つ目2つ目は、Java8のstreamを使ったソート方法を紹介していきます。

3つ目は、Java8が使えない!(職場のJavaが古すぎる問題を抱える方)のために、Java7でも使える昔ながらのソート方法も紹介していきます。

[スポンサーリンク]

目次

1つ目は、一番オススメといいますか、一般的でJava8現在で一番新しいソート方法です。

2つ目の方法については、こちらもJava8で使えるソート方法ですが、少し古いやり方です。少しみずらいと思うので1つ目の方がオススメな方法です。こういうのもあるなぁととどめておけばよいものと思っています。

3つ目はJava7以前のバージョンをお使いの方用です。

Java8のstreamを使った方法

streamを使ったソート方法はこの後も紹介しますが、こちらの方法が一番オススメです。
理由はのちほど紹介しますが、もしJava8を使っていてソート機能を作る場合はコチラの方法で実装していきましょう!

まずはソート対象となるエンティティクラスを作っていきます。
スタッフの名前とIDを持ったエンティティを作っておきます。

class Staff{
    public Staff( int id, String name ){ 
        this.id = id;
        this.name = name;
      }
    int id;
    String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

こちらがソートするためのロジックです。
java.util.Comparator.comparingをインポートし忘れないように気をつけて!

import static java.util.Comparator.comparing;

public static void main( String[] args ) {
    List<Staff> staffList = new ArrayList<>();
    staffList.add(new Staff(10,"鈴木"));
    staffList.add(new Staff(2,"田中"));
    staffList.add(new Staff(18,"佐藤"));
    
    // 昇順ソート
    System.out.println("昇順ソートをします。");
    staffList.stream().sorted(
            comparing(Staff::getId))
            .forEach(s -> 
                System.out.println("ID:" + s.getId() + " Name:" + s.getName()));

    // 降順ソート
    System.out.println("降順ソートをします。");
    staffList.stream().sorted(
            comparing(Staff::getId).reversed())
            .forEach(s -> 
                System.out.println("ID:" + s.getId() + " Name:" + s.getName()));

}
>実行結果
昇順ソートをします。
ID:2 Name:田中
ID:10 Name:鈴木
ID:18 Name:佐藤

降順ソートをします。
ID:18 Name:佐藤
ID:10 Name:鈴木
ID:2 Name:田中

リストのsortメソッドを使ったパターン

こちらもJava8のソート方法です。
先程の1つ目のソート方法と比べると昇順・降順が少しわかりにくいかと思います。
新しいやり方は1つ目なので、できればそちらを使って、こちらの方法はあったなというくらいにとどめておくほうがよいです。

こちらは先程と同じソート対象となるエンティティクラスです

class Staff{
    public Staff( int id, String name ){ 
        this.id = id;
        this.name = name;
      }
    int id;
    String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

こちらがソートするためのロジックです。
java.util.Comparator.comparingをインポートし忘れないように気をつけて!

import static java.util.Comparator.comparing;

public static void main( String[] args ) {
    List<Staff> staffList = new ArrayList<>();
    staffList.add(new Staff(10,"鈴木"));
    staffList.add(new Staff(2,"田中"));
    staffList.add(new Staff(18,"佐藤"));
    
    // 昇順ソート
    System.out.println("昇順ソートをします。");
    staffList.sort((a,b)-> a.getId() - b.getId() ); 
    staffList.forEach(s -> System.out.println("ID:" + s.getId() + " Name:" + s.getName()));

    // 降順ソート
    System.out.println("降順ソートをします。");
    staffList.sort((a,b)-> b.getId() - a.getId() ); 
    staffList.forEach(s -> System.out.println("ID:" + s.getId() + " Name:" + s.getName()));

}
>実行結果
昇順ソートをします。
ID:2 Name:田中
ID:10 Name:鈴木
ID:18 Name:佐藤

降順ソートをします。
ID:18 Name:佐藤
ID:10 Name:鈴木
ID:2 Name:田中

Java7以前でのみ使える古いソート方法

さて、最後はJava7以前の古いバージョンでも使えるソート方法です。
Java8でも使えますが、使うのはオススメできません。
どうしてもJava7しか使えないという方のみ使うようにしましょう!

こちらは先程と同じソート対象となるエンティティクラスです

class Staff{
    public Staff( int id, String name ){ 
        this.id = id;
        this.name = name;
      }
    int id;
    String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

こちらがソートするためのロジックです。

public static void main( String[] args ) {
    List<Staff> staffList = new ArrayList<>();
    staffList.add(new Staff(10,"鈴木"));
    staffList.add(new Staff(2,"田中"));
    staffList.add(new Staff(18,"佐藤"));
    
    // 昇順ソート
    System.out.println("昇順ソートをします。");
    Collections.sort(staffList, new Comparator<Staff>() {
        @Override
        public int compare(Staff o1, Staff o2) {
            return o1.getId() - o2.getId();
        }
    });
    for (Staff staff : staffList) {
        System.out.println("ID:" + staff.getId() + " Name:" + staff.getName());
    }
    
    // 降順ソート
    System.out.println("降順ソートをします。");
    Collections.sort(staffList, new Comparator<Staff>() {
        @Override
        public int compare(Staff o1, Staff o2) {
            return o2.getId() - o1.getId();
        }
    });
    for (Staff staff : staffList) {
        System.out.println("ID:" + staff.getId() + " Name:" + staff.getName());
    }
}
>実行結果
昇順ソートをします。
ID:2 Name:田中
ID:10 Name:鈴木
ID:18 Name:佐藤

降順ソートをします。
ID:18 Name:佐藤
ID:10 Name:鈴木
ID:2 Name:田中

さいごに

Javaでのオブジェクトのソート方法は色々ありますけどできるだけ1つ目の方法を使っていくことをオススメします!

3つ目のJava7以前でのやり方は、自分で書いていても懐かしくなりました。ということはやはりもう大分古いやり方になったのでしょうね。

月日が経つのは早いなぁと実感してしまいました。

それでは!