「IDまたは名前で従業員オブジェクトのコレクションをどのようにソートしますか」. そのために、2 つのインターフェイスを使用できます。つまり、Comparator and Comparable.
これは面接でよく聞かれる質問の 1 つです。
しかし、従業員オブジェクトの並べ替えに両方を使用する必要がある理由がわかりません
comparator
それComparable
ができないことは何かを考えてきました。オブジェクト (比較されるインスタンス変数) に自然な順序付けがある場合、それcomparable
が正しい選択であることを理解しています。ただし、カスタムの順序付けが必要な場合 (文字列の長さなど)は、クライアントが他の基準でデータを並べ替えたい場合にのみcomparator.
、ここに私のポイントを書くことができます。comparator
たとえば、を使用Employee class
して並べ替えを実装します。ただし、クライアントが Employee オブジェクトを(名前) で並べ替えたい場合は、具体的なクラスとして実装するか、並べ替えで匿名で実装します。ここに欠けているものはありますか?id
comparable interface
String
comparator
たとえば、次のコードでは、Person オブジェクトの場合、compareTo メソッドで年齢を比較して並べ替えています。compare メソッドでは、文字列の長さ (人物の名前) を使用して並べ替えています。理論的には、以下で実装したように、compareTo メソッドで両方を達成できます。
最後に、次のいずれかの追加の利点はありますか 2 つの方法でコンパレーターを実装しました。コンパレータを実装し、collections.sort() でそのクラスのインスタンスを呼び出す新しいクラス -- これはここでは行っていません
(The commented-out parts of the code works. They are just different implementations)
mport java.util.Collections;
import java.util.Comparator;
import java.util.*;
public class PersonComparator implements Comparable{
private String name;
private int age;
public PersonComparator(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name=" + name + ", age=" + age;
}
/*@Override
public int compareTo(Object obj) {
if (!(obj instanceof PersonComparator)) {
throw new ClassCastException("Invalid object");
}
PersonComparator p2 = (PersonComparator)obj;
return this.age-p2.age;
}*/
/*Alternative CompareTo that checks for both age and name*/
public int compareTo(Object obj) {
if (!(obj instanceof PersonComparator)) {
throw new ClassCastException("Invalid object");
}
PersonComparator p2 = (PersonComparator)obj;
if (this.age!=p2.age){
return this.age-p2.age;
}
else {
return (this.name.length()-p2.name.length());
}
}
/*public static Comparator nameLengthComparator
= new Comparator() {
@Override
public int compare(Object obj1, Object obj2) {
if (!(obj1 instanceof PersonComparator) || !(obj2 instanceof PersonComparator)){
throw new ClassCastException("Invalid object");
}
else {
PersonComparator p1 = (PersonComparator)obj1;
PersonComparator p2 = (PersonComparator)obj2;
return p1.name.length()-p2.name.length();
}
}
};*/
public static void main(String[] args){
PersonComparator p1 = new PersonComparator("Alexander", 45);
PersonComparator p2 = new PersonComparator("Pat", 27);
PersonComparator p3 = new PersonComparator("Zacky", 45);
PersonComparator p4 = new PersonComparator("Rake", 34);
List<PersonComparator> list = new ArrayList<PersonComparator>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
System.out.println("Before sorting "+ list);
Collections.sort(list);
//System.out.println("After sorting by age "+ list);
//System.out.println("Before sorting "+ list);
//Collections.sort(list, nameLengthComparator);
System.out.println("After sorting by name length "+ list);
/*Collections.sort(list, new Comparator<PersonComparator>() {
@Override
public int compare(PersonComparator p1, PersonComparator p2) {
return p1.name.length()-p2.name.length();
}
}
);*/
System.out.println("After sorting by name length "+ list);
}
}
ありがとう