[Java] 多次元配列のソート
自作クラスを用いてソートを行う
次のような二次元配列 A をソートしたいときは、自作を定義してソートを行うことができます。
int[][] A = {{2, 8}, {2, 3}, {1, 5}, {5, 9}};
第一要素を基準に昇順にソートし、第一要素が同じときは第二要素を基準に昇順にソートします。下の画像のようにソートさせます。

Comparable インターフェースを実装する
Comparable インターフェースを実装して、クラスのインスタンスが比較できるようにします。
import java.util.*; public class Test { public static void main(String[] args) { int[][] A = {{2, 8}, {2, 3}, {1, 5}, {5, 9}}; Data[] d = new Data[4]; for (int i = 0; i < 4; i++) { d[i] = new Data(A[i][0], A[i][1]); } Arrays.sort(d); for (int i = 0; i < 4; i++) { System.out.printf("%d %d\n", d[i].a, d[i].b); } } // Comparable インターフェースを実装する public static class Data implements Comparable<Data> { int a, b; public Data(int a, int b) { this.a = a; this.b = b; } public int compareTo(Data other) { if (this.a == other.a) { return this.b - other.b; } else { return this.a - other.a; } } } }
Comparator インターフェースを実装する
Comparator インターフェースを実装して、Arrays.sort() の第2引数に実装したクラスを渡します。このようにすることで、クラスのインスタンスの配列毎に基準の異なるソートを行うことができます。
import java.util.*; public class Test2 { public static void main(String[] args) { int[][] A = {{2, 8}, {2, 3}, {1, 5}, {5, 9}}; Data[] d = new Data[4]; for (int i = 0; i < 4; i++) { d[i] = new Data(A[i][0], A[i][1]); } Arrays.sort(d, new MyComparator()); for (int i = 0; i < 4; i++) { System.out.printf("%d %d\n", d[i].a, d[i].b); } } public static class Data { int a, b; public Data(int a, int b) { this.a = a; this.b = b; } } // Comparator インターフェースを実装する public static class MyComparator implements Comparator<Data> { public int compare(Data d1, Data d2) { if (d1.a == d2.a) { return d1.b - d2.a; } else { return d1.a - d2.a; } } } }
最近のコメント