JavaのComprableとCompratorの違いと使用シーン

19936 ワード

Comprableの位置:java.lang.cmparable;
Compratorの位置:java.util.comprator;
Collections.sort()とArays.sort()の方法はObject配列を並べ替えることができますが、この方法は対象のクラスがComprableインターフェースを実現しなければなりません。このインターフェースは並べ替え規則を指定するために使います。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class HDTV implements Comparable<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;
}

@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 static void main(String[] args) {
    HDTV tv1 = new HDTV(55, "Samsung");
    HDTV tv2 = new HDTV(60, "Sony");
    HDTV tv3 = new HDTV(35, "Apple");

    List<HDTV> list = new ArrayList<HDTV>();
    list.add(tv1);list.add(tv2);list.add(tv3);

    Collections.sort(list);

    for (HDTV tv : list) {
        System.out.println(tv.getSize()+"---"+tv.getBrand());
    }


}
一つのクラスがすでに開発されていますが、このような初期にはComprableインターフェースが実現されていません。この時は対象の並べ替え操作ができないに違いないです。この問題を解決するために、javaはもう一つのコンパレータの操作インターフェース、Compratorを定義しています。
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<HDTV> {
    @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<HDTV> al = new ArrayList<HDTV>();
    al.add(tv1);
    al.add(tv2);
    al.add(tv3);

    Collections.sort(al, new SizeComparator());
    for (HDTV a : al) {
        System.out.println(a.getBrand());
    }
}
まとめ:
Comprableは、オブジェクト自体が比較に必要なインターフェース(String、Integer自体が比較サイズの操作ができるように、Comprableインターフェースが実現されました)をサポートしています。
Compratorを使うのは戦略モードです。対象自体を変えずに戦略対象を変えることです。