Comprable vs.Comprator in Java

5305 ワード

原文はここのComprable vs.Comprator in Javaを押してください。ComparableおよびComparatorは、Java Core APIが提供する2つのインターフェースである。名前から分かるように、彼らはある方法で二つのオブジェクトを比較します。しかし、彼らは一体何ですか?彼らの間には何の違いがありますか?この二つの例はこの問題に答えます。下のコードを読み終わったら、どのようにComprable vs.Compratorを使うかについて詳しい認識があります。
ComprableComparableはクラスによって実現され、クラス自体のオブジェクトを他のオブジェクトと比較できるようにするためである。その実例的なオブジェクトを相互に比較できるように、クラスはこのインターフェースを実装しなければならない。CompareTo()方法を実装する必要があります。以下は例です。
class HDTV implements Comparable {
  private int size;
  private String brand;

  public HDTV(int size, String brand) {
      this.size = size;
      this.brand = brand;
  }

  public int getSize() {
      return size;
  }

  public void setSize(int size) {
    this.size = size;
  }

   public String getBrand() {
     return brand;
   }

  public void setBrand(String brand) {
    this.brand = brand;
  }

  @Override
  public int compareTo(HDTV tv) {

    if (this.getSize() > tv.getSize())
        return 1;
    else if (this.getSize() < tv.getSize())
        return -1;
    else
        return 0;
  }
}

public class Main {
    public static void main(String[] args) {
        HDTV tv1 = new HDTV(55, "Samsung");
        HDTV tv2 = new HDTV(60, "Sony");

        if (tv1.compareTo(tv2) > 0) {
          System.out.println(tv1.getBrand() + " is better.");
        } else {
        System.out.println(tv2.getBrand() + " is better.");
      }
    }
}
結果:Sony is better.
Comprator
場合によっては、クラスを変えてComprableインターフェースを実現したくないかもしれません。この場合、atribute/fieldsに基づいてオブジェクトを比較したいなら、Comparatorを使用することができます。例えば、2つのpersonを'height'または'age'によって比較することができる。
compre()方法を実現する必要があります。今は、方式を変えてこれらのTVをsizeで比較します。Comparatorの一般的な使い方は、順序付けを行うことである。CollectionsおよびArraysのクラスは、Comparatorを利用して並べ替えられる方法を提供する。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class HDTV {
    private int size;
    private String brand;

     public HDTV(int size, String brand) {
        this.size = size;
        this.brand = brand;
     }

     public int getSize() {
         return size;
         }

     public void setSize(int size) {
       this.size = size;
     }

     public String getBrand() {
       return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
  }

class SizeComparator implements Comparator {
    @Override
    public int compare(HDTV tv1, HDTV tv2) {
        int tv1Size = tv1.getSize();
        int tv2Size = tv2.getSize();

        if (tv1Size > tv2Size) {
            return 1;
        } else if (tv1Size < tv2Size) {
          return -1;
        } else {
            return 0;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        HDTV tv1 = new HDTV(55, "Samsung");
        HDTV tv2 = new HDTV(60, "Sony");
        HDTV tv3 = new HDTV(42, "Panasonic");

        ArrayList al = new ArrayList();
        al.add(tv1);
        al.add(tv2);
        al.add(tv3);

        Collections.sort(al, new SizeComparator());
        for (HDTV a : al) {
            System.out.println(a.getBrand());
        }
    }
}
出力:
Panasonic
Samsung
Sony
よく私たちはCollection.reverseOrder()方法を使って降順コンパレータを得ることができます。次の例のように:
 ArrayList al = new ArrayList();
 al.add(3);
 al.add(1);
 al.add(2);
 System.out.println(al);
 Collections.sort(al);
 System.out.println(al);

 Comparator comparator =   Collections.reverseOrder();
 Collections.sort(al,comparator);
 System.out.println(al);
出力:
[3,1,2]
[1,2,3]
[3,2,1]
どれを使うべきですか?
簡単に言えば、クラスがどのようにComparableを実装するかは比較可能になり、その例との間で相互に比較できることを意味する。
1つのクラスはComparatorを実現する必要があり、主に次の2つの状況にある:
  • は、順序を正確に制御するために、Collections.sort()およびArrays.sortなどの順序付け方法に渡される。
  • は、並べ替えられたsets(例えば、TreeSet)や並べ替えmaps(例えば、TreeMap)のようないくつかのデータ構造の並べ替えを制御するために使用されます。
    例を挙げます。TreeSetを作成して、Compratorを実現した構造関数を伝達してもいいし、対象クラスを比較してもいいです。
    方法1-TreeSet(Comprator comprator)
    class Dog {
        int size;
    
        Dog(int s) {
            size = s;
        }
    }
    
    class SizeComparator implements Comparator {
        @Override
        public int compare(Dog d1, Dog d2) {
            return d1.size - d2.size;
        }
    }
    
    public class ImpComparable {
        public static void main(String[] args) {
            TreeSet d = new TreeSet(new SizeComparator()); // pass comparator
            d.add(new Dog(1));
            d.add(new Dog(2));
            d.add(new Dog(1));
        }
    }
    
    方法二-Implement Comprable
    class Dog implements Comparable{
        int size;
    
        Dog(int s) {
            size = s;
        }
    
        @Override
        public int compareTo(Dog o) {
             return o.size - this.size;
        }
    }
    
    public class ImpComparable {
        public static void main(String[] args) {
          TreeSet d = new TreeSet();
          d.add(new Dog(1));
          d.add(new Dog(2));
          d.add(new Dog(1));
        }
    }  
    
    参考文献:1.comprable 2.Comprator