Java比較器を詳しく説明する


本文
Javaのオブジェクトは通常の状況では比較しかできません。==または!使用できません。しかし、実際の開発では、複数のオブジェクトを並べ替える必要があります。比較対象のサイズが必要です。
Javaがオブジェクトの並べ替えを実現する方法は2つあります。
  • 自然ランキング:java.lang.comprable
  • カスタムソート:java.util.comprator
  • 1.Comprable自然並び替え
  • は、String、包装などのComprableインターフェースを実現し、compreTo(obj)方法を書き換えて、2つのオブジェクトの大きさを比較する方法を提供している。
  • はString、包装類のようにcompreTo()を書き換える方法の後、小さい時から大きな順に並べられた
  • です。
  • compreTo(obj)のルールを書き換える:
  • 現在のオブジェクトのthisが、参照対象のOB jより大きい場合、正の整数を返します。
    現在のオブジェクトthisが、参照対象のOB jより小さい場合、負の整数を返します。
    現在のオブジェクトthisが参照対象のOB jに等しい場合、ゼロを返します。
  • はカスタムクラスに対して、順序付けが必要ならば、カスタマイズクラスにComprableインターフェースを実現させて、compreTo(obj)方法を書き換えることができます。compreTo(obj)方法ではどのように並べ替えられているかを指定します。デフォルトも小さい時から
  • までです。
    
    public void test1(){
        String[] arr = new String[]{"AA","BB","DD","WW","MM","PP","CC"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));//[AA, BB, CC, DD, MM, PP, WW]
      }
    
    カスタムクラスは書き換えが必要です。
    
    package com.atguigu.java1;
    
    /**
     * @author MD
     * @create 2020-07-13 15:52
     */
    public class Goods implements Comparable{
      private String name;
      private double price;
    
      public Goods() {
      }
    
      public Goods(String name, double price) {
        this.name = name;
        this.price = price;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public double getPrice() {
        return price;
      }
    
      public void setPrice(double price) {
        this.price = price;
      }
    
      @Override
      public String toString() {
        return "Goods{" +
            "name='" + name + '\'' +
            ", price=" + price +
            '}';
      }
    
      //            :           ,          
      @Override
      public int compareTo(Object o) {
        if(o instanceof Goods){
          Goods goods = (Goods)o;
          //    
          if (this.price > goods.price){
            return 1;
          }else if(this.price < goods.price){
            return -1;
          }else{
            //return 0;
            return this.name.compareTo(goods.name);
          }
          //    :
          //return Double.compare(this.price , goods.price);
        }
    
        throw new RuntimeException("        ");
    
      }
    }
    
    //   
    public void test2(){
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("lx",123.12);
        arr[1] = new Goods("xm",23.12);
        arr[2] = new Goods("hw",67);
        arr[3] = new Goods("de",99);
    
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    //[Goods{name='xm', price=23.12}, Goods{name='hw', price=67.0}, Goods{name='de', price=99.0}, Goods{name='lx', price=123.12}]
    
      }
    2.Compratorカスタムソート
    要素のタイプがjava.lang.cmparableインターフェースを実現していない場合、コードの修正が不便であるか、java.lang.cmparableインターフェースを実現した順序付け規則が現在の操作に適合していない場合、Compratorのオブジェクトを使用して並べ替えられます。
  • comppare(Object o 1,Object o 2)方法を書き換えて、o 1とo 2の大きさを比較します。もし方法が正の整数に戻るなら、o 1はo 2より大きいと表します。0を返したら、等しいことを表します。負の整数を返します。o 1がo 2以下であることを示します。
  • は、Collection.sortまたはArays.sortのようなCoparatorをsort方法に渡すことができ、順序付けの正確な制御を可能にする。
  • はまた、Compratorを使用して、順序setまたは規則的マッピングのようないくつかのデータ構造の順序を制御したり、自然順序のないオブジェクトのcollectionの順序を提供したりすることができる。
  • 
    //         ,String     compareTo(obj)     
    public void test3(){
        String[] arr = new String[]{"AA","BB","DD","WW","MM","PP","CC"};
      //       
        Arrays.sort(arr, new Comparator() {
    
          //          
          @Override
          public int compare(Object o1, Object o2) {
            if (o1 instanceof String && o2 instanceof String){
              String s1 = (String)o1;
              String s2 = (String)o2;
              return -s1.compareTo(s2);
            }
            throw new RuntimeException("     ");
          }
        });
        System.out.println(Arrays.toString(arr));//[WW, PP, MM, DD, CC, BB, AA]
    
      }
    デフォルトは小さい時から大きい時まで、直接に前に記号をつけることができます。高い時から低い時までです。
    String、包装類はすでにcompre()の直接呼び出しを実現しました。
    
    public void test4(){
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("lx",123.1);
        arr[1] = new Goods("lx",23.12);
        arr[2] = new Goods("hw",67);
        arr[3] = new Goods("de",99);
    
        //            ,             ,     ,           
        Arrays.sort(arr, new Comparator<Goods>() {
          @Override
          public int compare(Goods o1, Goods o2) {
            if (o1.getName().equals(o2.getName())){
              return -Double.compare(o1.getPrice(),o2.getPrice());
            }else{
              return o1.getName().compareTo(o2.getName());
            }
          }
        });
        System.out.println(Arrays.toString(arr));
      //[Goods{name='de', price=99.0}, Goods{name='hw', price=67.0}, Goods{name='lx', price=123.1}, Goods{name='lx', price=23.12}]
      }
    ComprableインターフェースとCompratorの使用の対比:
  • Comprableインターフェースの方式が一定であれば、Comprableインターフェース実装類のオブジェクトはどの位置でも比較できるようにする。
  • Compratorインターフェースは、一時的な比較に属する。
  • 以上はJava比較器の詳細を理解しました。Java比較器に関する資料は他の関連記事に注目してください。