[Java] 多次元配列のソート

2020年12月12日

自作クラスを用いてソートを行う

次のような二次元配列 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;
            }
        }
    }
}

Posted by ヤマカサ