同等 -java.lang.Comparable: int compareTo(Object o1)
比較可能なオブジェクトは、それ自体を別のオブジェクトと比較することができます。クラス自体は、インスタンスを比較できるようにするために、java.lang.Comparableインターフェースを実装する必要があります。
- 現在のオブジェクトと提供されたオブジェクトを比較できます。
- これを使用することonly one sort sequenceで、インスタンスプロパティに基づいて実装できます。例:Person.id
- String、Wrapperクラス、Date、Calendarなどの事前定義されたクラスには、Comparableインターフェースが実装されています。
コンパレータ -java.util.Comparator: int compare(Object o1, Object o2)
コンパレータオブジェクトは、2つの異なるオブジェクトを比較できます。クラスはインスタンスを比較していませんが、他のクラスのインスタンスを比較しています。このコンパレータクラスは、java.util.Comparatorインターフェースを実装する必要があります。
- 同じタイプの2つのオブジェクトを比較できます。
- これを使用することによりmany sort sequence、インスタンスのプロパティに基づいて、それぞれを実装して名前を付けることができます。例:Person.id, Person.name, Person.age
- カスタマイズされたソートのために、事前定義されたクラスにコンパレータインターフェースを実装できます。
例:
public class Employee implements Comparable<Employee> {
    private int id;
    private String name;
    private int age;
    private long salary;
    // Many sort sequences can be created with different names.
    public static Comparator<Employee> NameComparator = new Comparator<Employee>() {         
        @Override
        public int compare(Employee e1, Employee e2) {
            return e1.getName().compareTo(e2.getName());
        }
    };
    public static Comparator<Employee> idComparator = new Comparator<Employee>() {       
        @Override
        public int compare(Employee e1, Employee e2) {
            return Integer.valueOf(e1.getId()).compareTo(Integer.valueOf(e2.getId()));
        }
    };
    public Employee() { }
    public Employee(int id, String name, int age, long salary){
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    // setters and getters.
    // Only one sort sequence can be created with in the class.
    @Override
    public int compareTo(Employee e) {
    //return Integer.valueOf(this.id).compareTo(Integer.valueOf(e.id));
    //return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
        if (this.id > e.id) {
            return 1;
        }else if(this.id < e.id){
            return -1;
        }else {
            return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
        }
    }   
    public static void main(String[] args) {
        Employee e1 = new Employee(5, "Yash", 22, 1000);
        Employee e2 = new Employee(8, "Tharun", 24, 25000);
        List<Employee> list = new ArrayList<Employee>();
        list.add(e1);
        list.add(e2);
        Collections.sort(list); // call @compareTo(o1)
        Collections.sort(list, Employee.nameComparator); // call @compare (o1,o2)
        Collections.sort(list, Employee.idComparator); // call @compare (o1,o2)
    }
}
- カスタマイズされた並べ替えでは、コンパレータ@compare(o1、o2)を使用します。他のシナリオでは、比較可能な@compareTo(o1)を使用します。複数のフィールドを並べ替える場合は、コードを変更せずにコンパレータを使用します。 
以下のためのJava 8のラムダ:コンパレータは私のポストを参照してください。