概要
外部コンパレータ「のコンパレータと対応の内部コンパレータ」に匹敵対応しています。」
匹敵する例//: Collections.sort(リスト); //比較例: ソート・リストの、AscAgeComparatorがソートされている//「コンパレータ(AscAgeComparator)」、:の昇順に「年齢」 Collections.sortを(リスト、新しい新AscAgeComparator()); // "コンパレータ(DescAgeComparator)"、ソートリストのは、DescAgeComparatorがソートされている:降順で"年齢"に従ってソート Collections.sort(リスト、新しいDescAgeComparatorを() );
- 比較可能であるソートインターフェース。クラスはComparableインタフェースを実装している場合、それは「仕分けこのクラスのサポート」を意味します。今匹敵インタフェースをソートクラス支持体は今や、一覧リスト(または配列)はCollections.sort(又はは、Arrays.sort)によって行うことができる、「オブジェクトのリスト一覧同等インタフェースクラス(又はアレイ)を実装」の存在が仮定し、実施することをソート。また、コンパレータを指定せずに、「順序付けられたマップ(例えば、TreeMapの)」キーまたは「順序集合(TreeSetの)」要素として使用することができる「オブジェクトクラスは、Comparableインタフェースを実装します」。
- コンパレータは、コンパレータのインターフェース。私たちは、クラスの順序を制御する必要がありますが、クラス自体た場合(つまり、Comparableインタフェースを実装していない)順序付けをサポートしていません。我々は、ソートに「クラス比較」を構築することができます。「コンパレータ」コンパレータインタフェースが可能実装するだけです。言い換えれば、我々はその後、ソート、比較器によってクラスがを通じて、「新しいクラスコンパレータコンパレータが実現作成する」ことができます。
Comparableインタフェース
同等のプロフィール
同等のソート・インタフェースです。
クラスはComparableインタフェースを実装している場合、それは「仕分けこのクラスのサポート」を意味します。今匹敵インタフェースをソートクラス支持体は今や、一覧リスト(または配列)はCollections.sort(又はは、Arrays.sort)によって行うことができる、「オブジェクトのリスト一覧同等インタフェースクラス(又はアレイ)を実装」の存在が仮定し、実施することをソート。
また、コンパレータを指定せずに、「順序付けられたマップ(例えば、TreeMapの)」キーまたは「順序集合(TreeSetの)」要素として使用することができる「オブジェクトクラスは、Comparableインタフェースを実装します」。
同等の定義
同等のインターフェースは、以下のように定義されている唯一の機能を備えます。
パッケージjava.lang。 輸入java.utilの。*; パブリックインターフェース匹敵<T> { 公共のintのcompareTo(T O)。 }
説明:
我々はx.compareTo(y)を通ると仮定「xの大きさを比較し、yがあります。」リターン「負」手段「YよりもX小さい」場合、「ゼロ」への復帰手段「は、X「がYに等しく;戻る」正 『手段は、』 X」は、Yよりも大きいです
コンパレータインタフェース
コンパレータの紹介
コンパレータは、コンパレータのインターフェースです。
私たちは、クラスの順序を制御する必要がありますが、クラス自体た場合(つまり、Comparableインタフェースを実装していない)順序付けをサポートしていません。我々は、ソートに「クラス比較」を構築することができます。「コンパレータ」コンパレータインタフェースが可能実装するだけです。
言い換えれば、我々はその後、ソート、比較器によってクラスがを通じて、「新しいクラスコンパレータコンパレータが実現作成する」ことができます。
コンパレータ定義されました
コンパレータインタフェースは、次のように定義されている2つだけの機能を含みます。
パッケージjava.utilの。 パブリックインターフェースコンパレータ<T> { INT比較(T O1、T O2)。 ブール等しい(オブジェクトOBJ)。 }
説明:
(01)クラスは、コンパレータインタフェースを実装する場合:それがのcompareTo(T O1、T O2)の機能を達成しなければならないが、等しい(オブジェクトobj)関数を実装しなくてもよいです。
なぜ等号(オブジェクトobj)機能を実装することはできませんか?任意のクラスなので、デフォルトでは、既に対等の(オブジェクトobj)を達成しています。Object.java内のJava、すべてのクラスがjava.lang.Objectの由来である、器具等しい(オブジェクトobj)関数であるので、他のすべてのクラスも同等の機能を達成しています。
比較(02)INT(T O1、T O2) "O1及びO2の大きさを比較すること" です。「小よりO1、O2」「負」、手段に戻り、「ゼロ」に戻り、「O1、O2等しい」を意味する。復帰「陽性」を意味する「O1がO2よりも大きいです。」
例- 比較コンパレータと同等
同等のソート・インタフェースであり、クラスはComparableインタフェースを実装している場合、それは意味「仕分けこのクラスがサポートします。」
コンパレータは、コンパレータであり、私たちはクラスの順序を制御する必要がある場合は、ソートに「クラス比較」を作成することができます。
私たちは簡単に見つけることができます:匹敵する「内部コンパレータ」の同等、との比較に相当「外部コンパレータを。」
我々は、テストプログラムを介して2つのインターフェースを説明しました。ソースとして、次のとおりです。
java.utilのクラス*インポート;. インポートjava.lang.Comparableと; / ** 比較プログラムで* @desc「コンパレータ」と「同等」。 *(01)「同等」 )それはソート・インタフェースが一つだけの関数のcompareToを(含まれています*。 * Aクラスが実装する同等のインターフェースは、その意味は、Arrays.sort()またはCollections.sortを介して直接選別することができる「は、それ自体がソーティングをサポートクラス」、()。 *(02)「コンパレータ」 *が比較的二つの機能を備えたインタフェースである:比較()と等しいです()。 *クラスが実装するコンパレータのインターフェースが、それは「コンパレータ」です。他のクラスは、コンパレータに従ってソートすることができます。 * *要約:匹敵する内部コンパレータで、コンパレータは、外部のコンパレータです。 * Aクラス自体は、Comparableをコンパレータを実装し、それは自分自身をソートサポートしていることを意味し、それは自分自身Comparableを実装していなかった場合、それはまた、外部コンパレータコンパレータによってソートすることができます。 * / パブリッククラスCompareComparatorAndComparableTest { パブリック静的無効メイン(文字列[] args){ //新しいArrayListを(動的配列) ArrayListの<人>リスト=新しい新しいのArrayList <人>(); //」コンパレータ(AscAgeComparator) 『ソートリストの、 // AscAgeComparatorがソートされている:』年齢が「注文昇順 コレクションを.sort(リスト、新しいAscAgeComparator() ); // ArrayListにオブジェクトを追加 、List.add(新しい新規人物( "CCC"、20である)) List.add(新しい新規人物( "AAA"、30)); List.add(新しい新規人物( "BBB"、10) ); List.add(新しい新しい人( "DDD"、40)); //リスト印刷、元の配列の System.out.printf( "オリジナルのソート、リスト:%S \ N-"、リスト); //リストとソート //ここではすなわち「名前」に従ってソートされます、「人が同等の<文字列>インタフェース実装」に従ってソートされます Collections.sort(一覧); 名前ソートSystem.out.printf(」、リスト:%S \ N- "リスト); System.out.printf("昇順(年齢)ソート、リスト:%S \ N-」、リスト); // "コンパレータ(DescAgeComparator)"、ソートリストの // DescAgeComparator一種のそれらは:「年齢」降順に従って Collections.sort(リスト、新しいDescAgeComparator() ); System.out.printf("昇順(年齢)ソート、リスト:%S \ N-」、リスト); //判断し、同一人物かどうか2 testEquals( ); } / ** 等しいかどうか* @desc二人の比較試験。 *により人への実装用のequals()関数:2人の年齢、名前が同じであれば、同じ2人と考えられています。 *だから、ここ等しいP1およびP2です。 * * TODO:人に削除()関数に等しい場合、P1はP2に等しくない * / プライベート静的ボイドtestEquals(){ 人物P1 =新しい新規人物( "最も幅の広い"、100); 人物P2 =新しい新規人物( "最も幅の広いです" 、100); IF(p1.equals(P2)){ System.out.printf( "%sのEQUAL%S \ n"は、P1、P2)。 }他{ System.out.printf( "%sのNOT EQUAL%S \ n"は、P1、P2)。 } } / ** * Personクラス@desc。 *人实现了匹敵接口、这意味着人本身支持排序 * / プライベート静的クラスの人が実装Comparableを<人> { int型の年齢; 文字列の名前。 公共パーソン(文字列名、int型の年齢){ this.name =名; this.ageは年齢を=。 } パブリック文字列のgetName(){ 戻り名。 } 公共INT getAge(){ 戻り年齢; } パブリック文字列のtoString(){ 戻り名+ " - " +年齢。 } / ** * 2人の平等を比較:自分の名前と年齢である場合それらが同じであることを、等しい * / ブール等しい(人人){ IF(this.age this.name == == person.age && PERSON.NAME) 真に戻ります。 falseを返す; } / ** *のcompareTo <T T>の機能を書き換え、 "同等の<string>"インターフェース、すなわちを達成@desc。 *これは"人名"で比較される * / @Override 公共int型のcompareTo(人人){ リターンname.compareTo(PERSON.NAME); //はthis.nameを返す- PERSON.NAMEは; } } / ** * @descのAscAgeComparatorコンパレータ *それを"昇順コンパレータ人の年齢" * / プライベート静的クラスAscAgeComparator実装コンパレータ<人> { / ** * @descコンパレータDescAgeComparator @Override 公共INT比較(人物P1、人物P2){ p1.getAge()を返す- p2.getAge()。 } } *它是「人的年齢的降序比较器」 * / プライベート静的クラスDescAgeComparatorが実装するコンパレータ<人> { @Override 公共int型の比較(人物P1、人物P2){ p1.getAge( - p2.getAge()を返します); } } }
次のようにプログラムを実行すると、出力は次のようになります。
元のソート、リスト:[CCC - 20、AAA - 30、BBB - 10、DDD - 40] 名ソート、リスト:AAA - 30、BBB - 10、CCC - 20、DDD - 40] のAsc(年齢)ソート、リスト:[BBB - 10、CCC - 20、AAA - 30、DDD - 40] DESC(年齢)ソート、リスト:[DDD - 40、AAA - 30、CCC - 20、BBB - 10] EEE - 100 EQUALのEEE - 100
参照
Javaでの詳細な差匹敵およびコンパレータインタフェース https://www.jb51.net/article/123097.htm