Comprable vs.Comprator in Java
5305 ワード
原文はここのComprable vs.Comprator in Javaを押してください。
Comprable
Comprator
場合によっては、クラスを変えてComprableインターフェースを実現したくないかもしれません。この場合、atribute/fieldsに基づいてオブジェクトを比較したいなら、
compre()方法を実現する必要があります。今は、方式を変えてこれらのTVをsizeで比較します。
簡単に言えば、クラスがどのように
1つのクラスはは、順序を正確に制御するために、 は、並べ替えられたsets(例えば、
例を挙げます。
方法1-TreeSet(Comprator comprator)
Comparable
およびComparator
は、Java Core APIが提供する2つのインターフェースである。名前から分かるように、彼らはある方法で二つのオブジェクトを比較します。しかし、彼らは一体何ですか?彼らの間には何の違いがありますか?この二つの例はこの問題に答えます。下のコードを読み終わったら、どのようにComprable vs.Compratorを使うかについて詳しい認識があります。Comprable
Comparable
はクラスによって実現され、クラス自体のオブジェクトを他のオブジェクトと比較できるようにするためである。その実例的なオブジェクトを相互に比較できるように、クラスはこのインターフェースを実装しなければならない。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
などの順序付け方法に渡される。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 Comprableclass 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