クラス ファイルしかなく、Java のソース コードがありません。次に、それらを並べ替える必要があります。Comparator または Comparable を使用する必要がありますか?
あなたの助けに感謝。
クラス ファイルしかなく、Java のソース コードがありません。次に、それらを並べ替える必要があります。Comparator または Comparable を使用する必要がありますか?
あなたの助けに感謝。
Comparable
自分自身をそのクラスの別のインスタンスと比較する方法を知っているクラスによって実装されるインターフェイスです。
Comparator
異なるクラスの 2 つのインスタンスを比較するためのインターフェイスです。
Person
クラスがある場合、たとえば
public class Person implements Comparable<Person> {
private final String firstName;
private final String lastName;
...
public int compareTo(Person that) {
int rv = lastName.compareTo(that.lastName);
if (rv == 0)
rv = firstName.compareTo(that.firstName);
return rv;
}
}
これは、姓、名の順で自然にソートされるクラスです。つまり、Stephen Jones が John Smith の前になります。
これらのオブジェクトを名、姓の順に並べ替えて、John Smith が Stephen Jones の前になるようにするには、Comparator を使用します。
public class PersonComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
int rv = p1.getFirstName().compareTo(p2.getFirstName());
if (rv == 0)
rv = p1.getLastName().compareTo(p2.getLastName());
return rv;
}
}
どちらを使用するかは、クラスとインスタンスに対してどのような制御を行っているかによって異なります。
たとえば、 を実装していないクラスがあるがComparable
、それをサブクラス化してインターフェイスを実装でき、インスタンスを作成するのは自分だけであることが確実な場合は、 を使用できますComparable
。
ただし、一般的にComparator
は、より柔軟です。
ソース ファイルにアクセスできない場合は、 を使用Comparator
して並べ替えます。
class MyComparator implements Comparator<MyClass>{
@Override
public int compare(MyClass o1, MyClass o2) {
return o1.getType().compareTo(o2.getType());
}
}
// where getType is the getter method of the field on which you want to sort.
可能であれば、このクラスを拡張して Comparable を実装する新しいクラスを作成し、compareTo() を実装することができます。それ以外の場合は、Comparator as given を使用できます。
class MyComparator implements Comparator<MyClass>{
@Override
public int compare(MyClass o1, MyClass o2) {
return o1.getType().compareTo(o2.getType());
}
}
コンパレーターを使用すると、より多くのカスタマイズが必要になります。