自作クラスのフィールドでソート
自作クラスのフィールドでソート
競技プログラミングをしていると、独自クラスのフィールドで配列やリストをソートしたいということが非常によくあります。以下はラムダ式(Java8以降で実装)を使用すると従来(Comparableインターフェースを実装、Comparatorを実装)する方法よりもシンプルに実装できます。
実装
例として、今ユークリッド空間において、ある 点が与えられたとします。それぞれの座標を とします。この時、 座標で昇順にソートすることを試みます。
実装は以下のとおりです。
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座標で昇順にソートされていることが分かりました。ラムダ式を使用するとシンプルに実装できて良いですね。