ComparentとComparator
Primitive type(int,float,double)は2つの変数を比較できる不等式である.では、どのように相手を比較しますか?
対象に特別な比較基準はないので、基準を定める必要があります.これはCompareableとComparatorで解決できます.
CompareableとComparatorは、インタフェースによってメソッドオーバーライドを実装する必要があります.
Compabiledインタフェースは次のように定義されています.
Comparatorインタフェースで宣言されている多くのソート方法では、次の方法が必要です.
最初の出力結果は、ソート前に格納順に出力されます.
2番目の出力結果は、学号に準じて昇順に並べられ、Arrays.sort()でcompareToメソッドが呼び出され、標準でソートされることを示します.
最後の出力結果は、単位が同じ場合は昇順、そうでない場合は降順にソートすることを意味します.ソート時に使用するDouble.compare()はDoubleオブジェクトが提供するメソッドで、実数値を比較できます.
Comparatorの比較()メソッドは実装によってメソッドを再定義できますが、匿名オブジェクト(クラス)を使用してComparatorの比較機能を使用できます.
変数とメソッドを宣言し、他のクラスからインタフェースを継承または実装する一般的なクラスとは異なり、匿名クラスはクラスを宣言し、オブジェクトを作成し、1つのオブジェクトのみを生成する使い捨てクラスです.クラスを継承したり、インタフェースを1つだけ実装したりすることもできます.
Comparableはデフォルトのソート基準を実装し、Comparatorはデフォルトのソート基準以外のソート基準を実装します.
https://velog.io/@gillog/Java-Comparable-Comparator-Interface
対象に特別な比較基準はないので、基準を定める必要があります.これは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
Reference
この問題について(ComparentとComparator), 我々は、より多くの情報をここで見つけました https://velog.io/@im_lily/Comparable와-Comparatorテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol