■概要
「java.util.Comparator」
は、Javaの標準ライブラリにあるインタフェースで、オブジェクトの並び順(ソート順)を定義するために使用。
標準の比較方法(Comparable
)とは異なる順序でオブジェクトを並べたいときに便利。
▼基本構文
public interface Comparator<T> {
int compare(T o1, T o2);
}
compare(T o1, T o2)
o1
がo2
より小さい → 負の数を返すo1
とo2
が等しい → 0 を返すo1
がo2
より大きい → 正の数を返す
▼Comparableとの違い
特徴 | Comparable | Comparator |
---|---|---|
実装方法 | クラス自身がcompareTo() を実装 | 外部で比較ロジックを定義 |
並べ替え順 | 自然順序(1つ) | 複数の並び順を定義可能 |
使用場面 | デフォルトの順序を定義したいとき | 特定の条件で並び替えたいとき |
▼実装概要
今回は「java.util.Comparator」を実装、「compare」をオーバーライドし、独自のソート処理を作成する。
ソート概要は以下の通り。
- ID、NameのDtoクラスに対して、IDで降順(3, 2, 1)とする。
■サンプルコード
・IdNameDto.java
package dto;
public class IdNameDto {
private int id;
private String name;
// コンストラクタ
public IdNameDto(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
・OriginalComparator.java
package util;
import dto.IdNameDto;
import java.util.Comparator;
public class OriginalComparator implements Comparator<IdNameDto> {
// 大きい順に変更
@Override
public int compare(IdNameDto data1, IdNameDto data2) {
if (data1.getId() < data2.getId()) {
// 1: data2が前
return 1;
}
if (data1.getId() > data2.getId()) {
// -1: data1が前
return -1;
}
// 変更なし
return 0;
}
}
OriginalSortComparatorMain.java
import dto.IdNameDto;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import util.OriginalComparator;
public class OriginalSortComparatorMain {
public static void main(String[] args) {
IdNameDto[] idNameDto = {
new IdNameDto(2, "B"),
new IdNameDto(3, "C"),
new IdNameDto(1, "A")
};
List<IdNameDto> list = new ArrayList<IdNameDto>(Arrays.asList(idNameDto));
// 自作のソート処理でソート
list.sort(new OriginalComparator());
for (IdNameDto d : list) {
System.out.println(d.getName());
}
}
}
■実行結果
C
B
A
コメント