int型配列を要素として持つリストのソート
以下のように、配列の最初の要素が 20,30,10 から 10,20,30 となるように配列を昇順に並べ替えてみます。
[20, 3] [10, 2]
[30, 1] → [20, 3]
[10, 2] [30, 1]
配列を要素として持つリストは、JavaではComparatorを用いて並べ替えることができます。(他にもラムダ式などが使えます。)
Comparator
Comparator<int[]> comparator = new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[0], o2[0]);
}
};
Comparatorインターフェイスを実装したクラスを用いて、大小を比較する基準のようなものを作ることができます。これによって、配列の大小の比較を定義します。
Comparator<int[]> comparator = new Comparator<int[]>() {};
の部分では、Comparatorインターフェイスを実装したクラスのインスタンスの生成とメソッドの定義を同時に行う匿名クラスを用いています。
@Override
されているメソッドpublic int compare(int[] o1,int[] o2) {}
ではint型配列のo1,o2の大小を比較するcompareメソッドを定義しています。
return Integer.compare(o1[0], o2[0])
によってint型配列o1とo2の大小は、o1[0]とo2[0]の大小で定義されました。
以上により、配列の0番目の要素の大小を配列の大小の基準とするcomparatorを生成することができました。
先ほど定義したcomparatorをソートの引数に加えることにより、配列を要素とするリストをソートすることができます。
Collections.sort(list, comparator);
実行例
0番目の要素を基準
List<int[]> list = new ArrayList<int[]>();
int[] a = {20, 3};
int[] b = {30, 1};
int[] c = {10, 2};
list.add(a);
list.add(b);
list.add(c);
//[20, 3]
//[30, 1]
//[10, 2]
Comparator<int[]> comparator = new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[0], o2[0]);
}
};
Collections.sort(list, comparator);
for (int i=0;i<list.size();i++) {
System.out.println(Arrays.toString(list.get(i)));
}
//[10, 2]
//[20, 3]
//[30, 1]
1番目の要素を基準
Comparator<int[]> comparator = new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[1], o2[1]);
}
};
Collections.sort(list, comparator);
//[30, 1]
//[10, 2]
//[20, 3]
0番目の要素を基準、降順
Comparator<int[]> comparator = new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o2[0], o1[0]);
}
};
Collections.sort(list, comparator);
//[30, 1]
//[20, 3]
//[10, 2]
AtCoderでよく出ます。