:あなたはあなたの署名内の「同等」のサブクラスとして型Tを定義している、あなたは「T」の配列を渡すと、それがパラメータ内で使用されている
(T [ ])。コンパイラは、Tが少なくともComparableでなければならないことを知っています。
詳細情報:
一般的に、私はComparableを直接実装することを推奨しません。理由は、比較は常にあなたが知らない文脈の中にあるということです。
特定のコンテキストとの比較を実装するには、ComparableインターフェイスよりもComparatorインターフェイスを優先する必要があります。自然順序を定義したい場合は、パブリック定数として自然比較を提供できます。
いくつかの例:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparatorExample {
public static void main(String[] args) {
List<SomeObject> list = new ArrayList<>();
list.add(new SomeObject(1, "dhjf", "A"));
list.add(new SomeObject(4, "ghdg", "A"));
list.add(new SomeObject(6, "uztzt", "B"));
list.add(new SomeObject(1, "jhgf", "C"));
list.add(new SomeObject(3, "vbbn", "A"));
list.add(new SomeObject(99, "cvcxc", "A"));
list.add(new SomeObject(2, "dfdd", "G"));
// examples
Collections.sort(list, SomeObject.NATURAL);
Collections.sort(list, LexicographicOrderByCategoryAndName.INSTANCE);
LexicographicOrderByName.INSTANCE.compare(new SomeObject(99, "cvcxc", "A"), new SomeObject(54, "fdjnn", "C"));
}
public static class SomeObject {
public static Comparator<SomeObject> NATURAL = new Comparator<SomeObject>() {
@Override
public int compare(SomeObject arg0, SomeObject arg1) {
return arg1.getId() - arg0.getId();
}
};
private int id;
private String name;
private String category;
public SomeObject(int id, String name, String category) {
this.id = id;
this.name = name;
this.category = category;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getCategory() {
return category;
}
}
public static class LexicographicOrderByName implements Comparator<SomeObject> {
public static LexicographicOrderByName INSTANCE = new LexicographicOrderByName();
private LexicographicOrderByName() {
}
@Override
public int compare(SomeObject o1, SomeObject o2) {
return o1.getName().compareTo(o2.getName());
}
}
public static class LexicographicOrderByCategoryAndName implements Comparator<SomeObject> {
public static LexicographicOrderByCategoryAndName INSTANCE = new LexicographicOrderByCategoryAndName();
private LexicographicOrderByCategoryAndName() {
}
@Override
public int compare(SomeObject o1, SomeObject o2) {
int c = o1.getCategory().compareTo(o2.getCategory());
if (c == 0) {
c = o1.getName().compareTo(o2.getName());
}
return c;
}
}
}
同等インターフェイスでの問題は、オブジェクトの特定の比較を決めたら、あなたは永遠にそこにバインドされているということです。あなたはそれを変更するかもしれませんが、すべての文脈が同じ消去を持っているかどうかわからないので、副作用を期待して、変更する必要があります。
これは 'anArray'のオブジェクトのクラスで定義されています。 –