自作クラスのフィールドでソート

自作クラスのフィールドでソート

競技プログラミングをしていると、独自クラスのフィールドで配列やリストをソートしたいということが非常によくあります。以下はラムダ式(Java8以降で実装)を使用すると従来(Comparableインターフェースを実装、Comparatorを実装)する方法よりもシンプルに実装できます。

実装

例として、今ユークリッド空間において、ある 5 点が与えられたとします。それぞれの座標を (3, 5),(2, 8),(7, 1),(4, 2),(6, 9) とします。この時、 x 座標で昇順にソートすることを試みます。
実装は以下のとおりです。

package section1;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Sample {

    public static void main(String[] args) throws IOException {

        // 配列の場合
        Point[] points = new Point[5];
        points[0] = new Point(3, 5);
        points[1] = new Point(2, 8);
        points[2] = new Point(7, 1);
        points[3] = new Point(4, 2);
        points[4] = new Point(6, 9);

        // 昇順でソート
        Arrays.sort(points, (a, b) -> a.x - b.x);
        System.out.println("配列");
        System.out.println("x y");
        for (int i = 0; i < points.length; i++) {
            System.out.println(points[i].x +" " + points[i].y);
        }

        System.out.println();

        // Listの場合
        List<Point> list = new ArrayList<>();
        list.add(new Point(3, 5));
        list.add(new Point(2, 8));
        list.add(new Point(7, 1));
        list.add(new Point(4, 2));
        list.add(new Point(6, 9));

        // 昇順でソート
        System.out.println("リスト");
        System.out.println("x y");
        list.sort((a, b) -> a.x - b.x);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).x + " " + list.get(i).y);
        }

    }

    static class Point {
        int x, y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}
配列
x y
2 8
3 5
4 2
6 9
7 1

リスト
x y
2 8
3 5
4 2
6 9
7 1

配列、リストともにそれぞれx座標で昇順にソートされていることが分かりました。ラムダ式を使用するとシンプルに実装できて良いですね。