概要:Comparable
java.langインタフェースComparable
まず、公式APIを見てみましょう.
このインタフェースは、実装された各クラスのオブジェクトを強制的に並べ替えます.このソートをクラスの自然ソートと呼び,クラスのcompareToメソッドをその自然比較メソッドと呼ぶ.
このインタフェースを実装するオブジェクトのリスト(および配列)は、Collections.sort(およびArrays.sort)によって自動的にソートできます.このインタフェースを実装するオブジェクトは、比較器を指定することなく、順序マッピングのキーまたは順序セットの要素として使用できます.
クラスCの各e 1およびe 2については、e 1のみである.compareTo(e 2)==0とe 1.equals(e 2)が同じboolean値を持つ場合,クラスCの自然ソートはequalsと一致する.nullはクラスのインスタンスではありません.e.equals(null)がfalseを返しても、e.compareTo(null)はNullPointerExceptionを放出します.
必須ではないが、自然ソートをequalsと一致させることを推奨します.これは、自然ソートがequalsと一致しない要素(またはキー)を使用する場合、明示的な比較器のない秩序化された集合(および秩序化マッピングテーブル)の動作が「奇妙」を示すためです.特に、このような秩序化された集合(または秩序化マッピングテーブル)はequalsメソッドによって定義された集合に反します.(またはマッピングテーブル)の一般的な協定.
たとえば、明示的な比較器を使用しない秩序化された集合に2つのキーaおよびbを追加し、(!a.equals(b)&&a.compareTo(b)==0)とすると、2番目のadd操作は、秩序化された集合の角度からaおよびbが等しいためfalse(秩序化された集合のサイズが増加していない)を返す.
実際,Comparableを実装するJavaコアクラスはすべてequalsと一致する自然ソートを持つ. java.math.BigDecimalは例外で、値が等しいが精度が異なるBigDecimalオブジェクト(4.0や4.00など)を自然なソートで同等と見なします.
数学的には,与えられたクラスC上の自然並べ替えを定義する関係式は,{(x,y)|x.compareTo(y)<=0}である.全体の順位付けは、{(x,y)|x.compareTo(y)==0}です.それは直接compareToの協定に従って、商はCの等価関係で、自然な順序はCの全体の順序です.クラスの自然並べ替えがequalsと一致するといえば,自然並べ替えの商がクラスのequals(Object)メソッドによって定義される等価関係を指す.{(x, y)|x.equals(y)}.
以下は個人的な理解ですが、理解が不十分な場合は軽く撮ってください.単純使用
まず、公式APIを見てみましょう.
このインタフェースは、実装された各クラスのオブジェクトを強制的に並べ替えます.このソートをクラスの自然ソートと呼び,クラスのcompareToメソッドをその自然比較メソッドと呼ぶ.
このインタフェースを実装するオブジェクトのリスト(および配列)は、Collections.sort(およびArrays.sort)によって自動的にソートできます.このインタフェースを実装するオブジェクトは、比較器を指定することなく、順序マッピングのキーまたは順序セットの要素として使用できます.
クラスCの各e 1およびe 2については、e 1のみである.compareTo(e 2)==0とe 1.equals(e 2)が同じboolean値を持つ場合,クラスCの自然ソートはequalsと一致する.nullはクラスのインスタンスではありません.e.equals(null)がfalseを返しても、e.compareTo(null)はNullPointerExceptionを放出します.
必須ではないが、自然ソートをequalsと一致させることを推奨します.これは、自然ソートがequalsと一致しない要素(またはキー)を使用する場合、明示的な比較器のない秩序化された集合(および秩序化マッピングテーブル)の動作が「奇妙」を示すためです.特に、このような秩序化された集合(または秩序化マッピングテーブル)はequalsメソッドによって定義された集合に反します.(またはマッピングテーブル)の一般的な協定.
たとえば、明示的な比較器を使用しない秩序化された集合に2つのキーaおよびbを追加し、(!a.equals(b)&&a.compareTo(b)==0)とすると、2番目のadd操作は、秩序化された集合の角度からaおよびbが等しいためfalse(秩序化された集合のサイズが増加していない)を返す.
実際,Comparableを実装するJavaコアクラスはすべてequalsと一致する自然ソートを持つ. java.math.BigDecimalは例外で、値が等しいが精度が異なるBigDecimalオブジェクト(4.0や4.00など)を自然なソートで同等と見なします.
数学的には,与えられたクラスC上の自然並べ替えを定義する関係式は,{(x,y)|x.compareTo(y)<=0}である.全体の順位付けは、{(x,y)|x.compareTo(y)==0}です.それは直接compareToの協定に従って、商はCの等価関係で、自然な順序はCの全体の順序です.クラスの自然並べ替えがequalsと一致するといえば,自然並べ替えの商がクラスのequals(Object)メソッドによって定義される等価関係を指す.{(x, y)|x.equals(y)}.
以下は個人的な理解ですが、理解が不十分な場合は軽く撮ってください.
//
Student[] stu = {new Student(1,"1"),new Student(3,"3"),new Student(2,"2")};
Arrays.sort(stu);
for (Student ss : stu){
System.out.println(ss);
}
System.out.println("------- -------");
//
List list = new ArrayList<>();
list.add(new Student(1,"1"));
list.add(new Student(3,"3"));
list.add(new Student(2,"2"));
list.sort(null);
// Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// , Comparable
public class Student implements Comparable<Student>{
@Override
public int compareTo(Student o) {
return this.getId() - o.getId();
}
}