Java基盤 - 匹敵するとコンパレータのインタフェースの違い

概要

外部コンパレータ「のコンパレータと対応の内部コンパレータ」に匹敵対応しています。」

    
    匹敵する例//:
    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

おすすめ

転載: www.cnblogs.com/frankcui/p/12118174.html