【Java】Comparatorを使用して独自のソート処理

■概要

「java.util.Comparator」 は、Javaの標準ライブラリにあるインタフェースで、オブジェクトの並び順(ソート順)を定義するために使用。
標準の比較方法(Comparable)とは異なる順序でオブジェクトを並べたいときに便利。

▼基本構文

public interface Comparator<T> {
    int compare(T o1, T o2);
}

compare(T o1, T o2)

  • o1o2 より小さい → 負の数を返す
  • o1o2 が等しい → 0 を返す
  • o1o2 より大きい → 正の数を返す

▼Comparableとの違い

特徴ComparableComparator
実装方法クラス自身が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

コメント