Javaコンパレータ-ComparableインタフェースとComparatorインタフェース

2846 ワード

Javaではオブジェクト配列の並べ替え問題が頻繁に発生しますが、オブジェクト間の比較問題に関連します.JavaはC++のように演算子をリロードできないため、>または
ナチュラルソート:java.lang.Comparable
  • Comparableインタフェースは、それを実装する各クラスのオブジェクトを強制的に並べ替えます.このソートはクラスの自然ソートと呼ばれます.
  • Comparableインタフェースを実装するクラスは、2つのオブジェクトがcompareTo(Object obj)メソッドの戻り値によってサイズを比較するcompareTo(Object obj)メソッドを実装する必要があります.現在のオブジェクトthisがパラメータオブジェクトobjより大きい場合は正の整数を返し、現在のオブジェクトthisがパラメータオブジェクトobjより小さい場合は負の整数を返し、現在のオブジェクトthisがパラメータオブジェクトobjに等しい場合はゼロを返します.
  • Comparableインタフェースを実装するオブジェクトのリスト(および配列)は、Collections.sortまたはArrays.sortによって自動的にソートできます.このインタフェースを実装するオブジェクトは、比較器を指定することなく、順序マッピングのキーまたは順序セットの要素として使用できます.
  • クラスCの各e 1およびe 2について、クラスCの自然な順序付けは、e 1.compareTo(e 2)==0がe 1.equals(e 2)と同じboolean値を有する場合にのみequalsと呼ばれる.(必須ではないが)自然ソートをequalsと一致させることを推奨します.

  •  カスタムソート:java.util.comparator
  • 要素のタイプがjava.lang.Comparableインタフェースを実装しておらず、コードの変更が容易ではない場合、またはjava.lang.Comparableインタフェースを実装したソート規則が現在の操作に適していない場合、Comparatorのオブジェクトを使用してソートし、複数のオブジェクトの全体的なソートの比較を強行することを考慮することができます. 
  • compare(Object o 1,Object o 2)メソッドを書き換え、o 1とo 2のサイズを比較する.メソッドが正の整数を返すと、o 1がo 2より大きいことを示す.0を返すと、等しいことを示します.負の整数を返し、o 1がo 2より小さいことを示す. 
  • は、ComparatorをCollections.sortまたはArrays.sortのようなsortメソッドに渡すことができ、順序付けの正確な制御を可能にする. 
  • はまた、comparatorを使用して、秩序setまたは秩序マッピングなどの特定のデータ構造の順序を制御したり、自然な順序のないオブジェクトcollectionの順序を指定したりすることもできます.

  • ComparableインタフェースとComparatorインタフェースの使用の比較:
  •    Comparableインタフェースの方法が一定になると、Comparableインタフェース実装クラスのオブジェクトが任意の場所でサイズを比較できることを保証します.このインタフェースは比較が必要なクラス自体で実現される.したがって,このクラス自体に属する比較ルールである.
  •    Comparatorインタフェースは一時的な比較に属します.このインタフェースは、外部比較器クラスを宣言するために使用され、通常は匿名の内部クラスの形式で使用されます.したがって,一時的に変化する比較規則である.

  • 使用例:
    public void test4(){
            Goods[] arr = new Goods[6];
            arr[0] = new Goods("lenovoMouse",34);
            arr[1] = new Goods("dellMouse",43);
            arr[2] = new Goods("xiaomiMouse",12);
            arr[3] = new Goods("huaweiMouse",65);
            arr[4] = new Goods("huaweiMouse",224);
            arr[5] = new Goods("microsoftMouse",43);
    
            Arrays.sort(arr, new Comparator() {
                //           :            ,           
                @Override
                public int compare(Object o1, Object o2) {
                    if(o1 instanceof Goods && o2 instanceof Goods){
                        Goods g1 = (Goods)o1;
                        Goods g2 = (Goods)o2;
                        if(g1.getName().equals(g2.getName())){
                            return -Double.compare(g1.getPrice(),g2.getPrice());
                        }else{
                            return g1.getName().compareTo(g2.getName());
                        }
                    }
                    throw new RuntimeException("          ");
                }
            });
    
            System.out.println(Arrays.toString(arr));
        }