ComparentとComparator


Primitive type(int,float,double)は2つの変数を比較できる不等式である.では、どのように相手を比較しますか?
対象に特別な比較基準はないので、基準を定める必要があります.これはCompareableとComparatorで解決できます.
CompareableとComparatorは、インタフェースによってメソッドオーバーライドを実装する必要があります.

Comparable


Compabiledインタフェースは次のように定義されています.
public interface Comparable<T> {
	public int compareTo(T o);
}
Comp耕地はJavaです.langパッケージの場合、インポートする必要はなく、実装時にcompareTo(T o)メソッドを再定義する必要があります.compareTo(T o)メソッドには、「自己とパラメータオブジェクトを比較する」ためのパラメータが1つしかありません.

Comparator


Comparatorインタフェースで宣言されている多くのソート方法では、次の方法が必要です.
public interface Comparator<T> {
	int compare(T o1, T o2);
}
ComparatorはJavaです.utilパッケージについては、インポートする必要があり、実装時にcompareTo(To 1,To 2)メソッドを再定義する必要があります.Comparator(To 1,To 2)メソッドには、2つのパラメータが必要です.

Comparable、Comparatorの例


public class SortEx {
    public static void main(String[] args) {
        Student[] student = new Student[4];
        student[0] = new Student("길록", 20140151, 3.5);
        student[1] = new Student("이후배", 20150001, 4.5);
        student[2] = new Student("강선배", 20110001, 3.5);
        student[3] = new Student("홍회장", 20130001, 2.8);

        System.out.println("==== 정렬 전 ====");
        for (Student s : student) {
            System.out.println(s.toString());
        }
        System.out.println();

        Arrays.sort(student); // 학번을 기준으로 오름차순 정렬
        System.out.println("==== 정렬 후 ====");
        for (Student s : student) {
            System.out.println(s.toString());
        }
        System.out.println();

        Arrays.sort(student, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                double s1Score = o1.score;
                double s2Score = o2.score;
                if (s1Score == s2Score) { // 학점이 같으면
                    return Double.compare(o1.stuNo, o2.stuNo); // 학번 오름차순
                }
                return Double.compare(s2Score, s1Score); // 학점 내림차순
            }
        });
        System.out.println("==== 학점 추가 정렬 ====");
        for (Student s : student) {
            System.out.println(s.toString());
        }
    }
}

class Student implements Comparable<Student> {
    String name; // 이름
    int stuNo; // 학번
    double score; // 학점

    public Student(String name, int stuNo, double score) {
        this.name = name;
        this.stuNo = stuNo;
        this.score = score;
    }

    @Override
    public int compareTo(Student o) {
        // 학번을 기준으로 오름차순 정렬
//        if (this.stuNo > o.stuNo) {
//            return 1;
//        } else if (this.stuNo < o.stuNo) {
//            return -1;
//        } else {
//            return 0;
//        }
        return this.stuNo - o.stuNo;
    }

    @Override
    public String toString() {
        return "이름 : " + name + ", 학번 : " + stuNo + ", 학점 : " + score;
    }
}

  • 最初の出力結果は、ソート前に格納順に出力されます.

  • 2番目の出力結果は、学号に準じて昇順に並べられ、Arrays.sort()でcompareToメソッドが呼び出され、標準でソートされることを示します.

  • 最後の出力結果は、単位が同じ場合は昇順、そうでない場合は降順にソートすることを意味します.ソート時に使用するDouble.compare()はDoubleオブジェクトが提供するメソッドで、実数値を比較できます.

  • Comparatorの比較()メソッドは実装によってメソッドを再定義できますが、匿名オブジェクト(クラス)を使用してComparatorの比較機能を使用できます.
    変数とメソッドを宣言し、他のクラスからインタフェースを継承または実装する一般的なクラスとは異なり、匿名クラスはクラスを宣言し、オブジェクトを作成し、1つのオブジェクトのみを生成する使い捨てクラスです.クラスを継承したり、インタフェースを1つだけ実装したりすることもできます.
  • 匿名クラスの例

    new 부모클래스이름() {
    	// 멤버 선언
    } 
    또는
    new 구현인터페이스이름() {
    	// 멤버 선언
    }

    Summary


    Comparableはデフォルトのソート基準を実装し、Comparatorはデフォルトのソート基準以外のソート基準を実装します.

    Reference

  • https://velog.io/@gillog/Java-Comparable-Comparator-Interface