同等
同等のソートインターフェイスです。
クラスが同等のインターフェイスを実装する場合、それは「このクラスがソートをサポートする」を意味します。同等のインターフェイスをサポートするクラスを実装するクラスは、「同等のインターフェイスを実装するクラスのオブジェクトのリスト(または配列)があると仮定すると、リスト(または配列)をcollections.sort(またはarray.sort)でソートできます。
さらに、「比較可能なインターフェイスを実装するクラスのオブジェクト」は、「順序付けされたマップ(Treemapなど)」のキーとして、またはコンパレータを指定せずに「順序付けられたセット(treeset)」の要素として使用できます。
同等のインターフェイスには1つの関数のみが含まれ、その定義は次のとおりです。
パッケージjava.lang; import java.util。*; public interface comparable <t> {public int compareto(t o);}説明:X.comPareTo(Y)を介して「xとyのサイズを比較する」とします。 「負の数」を返す場合、「xはyよりも小さい」を意味します。 「ゼロ」を返す場合、「xはyに等しい」を意味します。 「正の数」を返す場合、「xはyより大きい」を意味します。
同等のインターフェイスは一般的なものであるため、同等のタイプを実装するオブジェクトは、それがどのタイプと比較できるかを宣言します。 (一般的に、これはオブジェクト自体のタイプですが、時には親クラスである場合もあります。)
public interface comparable {public boolean Compareto(t other); }
したがって、比較可能なインターフェイスには、型パラメーターtが含まれています。これは、同等のクラスが比較できるクラスのタイプです。これは、文字列などの比較可能なクラスを定義する場合、クラスが比較をサポートするだけでなく、(通常はそれ自体と比較できるものも宣言する必要があることを意味します。
パブリッククラスの文字列は同等の{...}を実装しています
次に、バイナリmax()メソッドの実装を考えてみましょう。同じタイプの2つのパラメーターを受け入れたいと思います。どちらも同等で、互いに匹敵します。幸いなことに、これは一般的な方法と制限された型パラメーターを使用する場合、非常に直感的です。
public static> t max(t t1、t t2){if(t1.compareto(t2)> 0)return t1;それ以外の場合はT2を返します。 }
この例では、タイプTで生成される一般的なメソッドを定義し、型拡張(実装)を比較可能に制限します。どちらのパラメーターもタイプTでなければなりません。つまり、それらは同じタイプ、サポート比較であり、互いに匹敵します。簡単!
さらに良いことに、コンパイラはタイプ推論を使用して、max()が呼び出されたときにtの値が何を意味するかを判断します。したがって、Tをまったく指定する必要はありません。次の呼び出しは機能します。
string s = max( "moo"、 "Bark");
コンパイラは、tの所定の値が文字列であると計算されるため、コンパイルとタイプチェックを実行します。ただし、同等の実装を実装していないクラスXへの引数を使用してmax()を呼び出すと、コンパイラはこれを許可しません。
コンパレータ
コンパレータはコンパレータインターフェイスです。
特定のクラスの順序を制御する必要がある場合、それ自体がソートをサポートしていません(つまり、同等のインターフェイスを実装しません)。次に、ソートするために「このクラスのコンパレータ」を確立できます。この「コンパレータ」は、コンパレータインターフェイスを実装する必要があります。
つまり、「コンパレータクラスの実装」により新しいコンパレータを作成し、コンパレータを介してクラスを並べ替えることができます。
コンパレータインターフェイスには2つの関数のみが含まれており、その定義は次のとおりです。
パッケージjava.util; public interface Comparator <t> {int Compare(T o1、t o2); boolean equals(オブジェクトobj);}説明:
1.クラスがコンパレータインターフェイスを実装したい場合:比較(T o1、t o2)関数を実装する必要がありますが、equals(object obj)関数を実装できない場合があります。
なぜequals(オブジェクトOBJ)関数を実装できないのですか?デフォルトでは、Equals(オブジェクトOBJ)が実装されているためです。 Javaのすべてのクラスはjava.lang.objectから継承され、equals(object obj)関数はobject.javaに実装されています。したがって、他のすべてのクラスは、この関数の実装と同等です。
2.int比較(T o1、t o2)は「O1とO2のサイズを比較してください」です。 「負の数」を返すことは、「O1はO2よりも小さい」を意味します。 「O1はO2に等しい」を意味する「ゼロ」を返します。 「正の数」を返すことは、「O1がO2より大きい」ということを意味します。
コンパレータと比較可能
同等はソートインターフェイスです。クラスが同等のインターフェイスを実装する場合、「このクラスがソートをサポートする」を意味します。
コンパレータはコンパレータです。特定のクラスの順序を制御する必要がある場合は、「このクラスのコンパレータ」を確立してソートできます。
比較可能は「内部コンパレータ」と同等であり、コンパレータは「外部コンパレータ」と同等であることを見つけることは難しくありません。
テストプログラムを使用して、これら2つのインターフェイスを説明します。ソースコードは次のとおりです。
Import java.util。*; Import java.lang.comparable;/*** @desc比較プログラム「Comparator」と「Comparable」の間の比較プログラム。 *(01)「同等の」 *これは、1つの関数compareto()のみを含むソートインターフェイスです。 *クラスは、同等のインターフェイスを実装します。これは、「クラス自体がソートをサポートする」を意味します。これは、arrays.sort()またはcollections.sort()を介して直接ソートできます。 *(02) "Comparator" *これは、2つの関数を含むコンパレータインターフェイスです:比較()とequals()。 *クラスはコンパレータインターフェイスを実装し、「コンパレータ」です。他のクラスは、コンパレータに従ってソートすることができます。 * *要約する:比較可能は内部コンパレータであり、コンパレータは外部コンパレータです。 *クラス自体が同等のコンパレータを実装します。つまり、ソートをサポートします。それが比較可能なそれ自体を実装しない場合、外部コンパレータコンパレータを介してソートすることもできます。 */public class comparecomparatorandcomparabletest {public static void main(string [] args){// new arraylist(dynamic array)arraylist <serson> list = new arraylist <serson>(); // arrayList list.add(new Person( "CCC"、20))にオブジェクトを追加します。 list.add(新しい人( "aaa"、30)); list.add(new Person( "BBB"、10)); list.add(new person( "ddd"、40)); //リストsystem.out.printfの元のシーケンスを印刷します( "original sort、list:%s/n"、list); //リストを並べ替える//ここでは、「人によって実装された比較可能な<string>インターフェイス」に従ってソートされます。つまり、「name」、collections.sort(list)に従ってソートされます。 System.out.printf( "name sort、list:%s/n"、list); //「Comparator(AscageComparator)」を介してリストを並べ替える// ASCAGECOMPARATORのソートメソッドは次のとおりです。「年齢」collections.sort(list、new ascageComparator())の昇順に従ってソートされます。 System.out.printf( "asc(age)sort、list:%s/n"、list); //「Comparator(descageComparator)」を使用してリストを並べ替えます。 // descageComparatorの並べ替え方法は次のとおりです。「年齢」collections.sort(list、new descageComparator())の下降順序に従って並べ替えます。 System.out.printf( "desc(age)sort、list:%s/n"、list); // 2人が同等のテストquals()であるかどうかを判断します。 } /*** @DESCテスト2人が等しいかどうかをテストします。 *人はequals()関数を実装するため:2人の年齢と名前が等しい場合、2人は等しいと見なされます。 *したがって、ここではP1とP2が等しい。 * * todo:equals()関数が直接削除された場合、p1はp2 */ private static void testequals(){person p1 = new person( "eee"、100);人P2 =新しい人( "eee"、100); if(p1.equals(p2)){system.out.printf( "%s等しい%s/n"、p1、p2); } else {system.out.printf( "%sは等しい%s/n"、p1、p2); }} /*** @desc personクラス。 *人は同等のインターフェイスを実装します。つまり、人自体がソートをサポートしていることを意味します*/ private static classの人は、比較可能な<person> {int age;文字列名; public Person(string name、int age){this.name = name; this.age = age; } public string getname(){return name; } public int getage(){return age; } public string toString(){return name + " - " + age; } / *** 2人が等しいかどうかを比較してください。名前と年齢が等しい場合、それらは等しいと見なされます* / boolean equals(人の人){if(this.age == person.age && this.name == person.name)return true; falseを返します。 } /*** @desc "comparable <string>"のインターフェイスを実装してください。つまり、比較<t>関数を書き直します。 *「個人の名前」による比較です*/ @Override public int compareto(person person){return name.compareto(person.name); // this.name -person.name; }} / *** @desc ascagecomparator Comparator*それは「人の年齢の昇順コンパレータ」* / private static class ascagecomparatorを実装しています<serson> {@override public int compare(person p1、person p2){return p1.getage()-p2.getage(); }} / *** @desc descagecomparator Comparator*それは「人の年齢の昇順のコンパレータ」* / private static class descagecomparatorを実装しています<serson> {@override public int compare(person p1、person p2){return p2.getage()-p1.getage(); }}}以下は、このプログラムの説明です。
1.パーソンクラスの定義。次のように:
プライベートの静的クラスの人は、同等の<パーソン> {int age;文字列名; ... /*** @DESCは、「比較可能な<string>」のインターフェイスを実装します。つまり、比較<t>関数をオーバーライドします。 *「個人の名前」による比較です*/ @Override public int compareto(person person){return name.compareto(person.name); // this.name -person.name; }}説明:
(1)人クラスは人を表します。 Persongクラスには、年齢(年齢)と「個人名」という名前の2つの属性があります。
(2)人クラスは同等のインターフェイスを実装するため、ソートすることができます。
2。main()では、個人のリスト配列(リスト)を作成します。次のように:
//新しいarrayList(dynamic array)arrayList <serson> list = new arrayList <serson>(); // arrayList list.add(new person( "ccc"、20)); list.add(new person( "aaa"、30)); list.add(new person( "bbb"); add( "、add);
3.次に、リストのすべての要素を印刷します。次のように:
// list system.out.printfの元のシーケンスを印刷します( "original sort、list:%s/n"、list);
4。次に、リストをコレクションのsort()関数を並べ替えます。
人は同等のインターフェイスを実装しているため、sort()を並べ替えると、人がサポートするソートメソッド、つまり比較(人)によって定義されたルールに従ってソートされます。次のように:
//リストを並べ替える//ここでは、「人によって実装された「比較可能な<string>インターフェイス」、つまり「name」collections.sort(list)に従って並べ替えます。 System.out.printf( "name sort、list:%s/n"、list);
5。比較可能とコンパレータ
AscageComparatorとDescageComparatorの2つのコンパレーターを、それぞれ上昇および下位担当者を定義します。
6. ASSAGECOMPARATOR COMPARATORそれは、年齢ごとに昇順で人を並べ替えます。コードは次のとおりです。
/*** @DESC ASCAGECOMPARATOR COMPARATOR*それは「人の年齢の昇順コンパレータ」です*/私的な静的クラスASCAGECOMPARATORを実装しています<Person> {@Override public int Compare(Person P1、Person P2){return p1.getage() - p2.getage(); }} 7.デスカゲコンパレーターコンパレーターは、年齢ごとに降順で人を並べ替えます。コードは次のとおりです。
/*** @desc descagecomparatorコンパレーター*それは「人の年齢の昇順のコンパレータ」です*/private static class descagecomparatorは、比較<serson> {@override public int compare(perse p1、person p2){return p2.getage() - p1.getage(); }} 8。結果としてプログラムを実行すると、出力は次のとおりです。
オリジナルソート、リスト:[CCC -20、AAA -30、BBB -10、DDD -40]名前ソート、リスト:[AAA -30、BBB -10、CCC -20、DDD -40] ASC(年齢)ソート、リスト: BBB -10] EEE -100等しいEEE -100