「您將如何按員工ID或姓名對員工對象進行排序」。爲此,我們可以使用兩個接口,即Comparator and Comparable.
看來這是對常見的面試問題比較器優於比較器的方式是什麼?
之一,但我不明白爲什麼我應該使用這兩種排序Employee對象
我一直在想一個理由comparator
做什麼Comparable
不能做。 我知道如果對象(比較的實例變量)有自然排序,那麼comparable
是正確的選擇。 但如果需要自定義排序(例如字符串長度),那麼可以編寫一個comparator.
我的觀點是comparator
只有客戶端需要,如果他想按照其他條件對數據進行排序。 例如,我將實施Employee class
,使用comparable interface
按id
排序。 ,但如果客戶想按String
(姓名)對Employee對象進行排序,他將實現comparator
作爲具體類或匿名排序。 有什麼我在這裏失蹤?
例如,在以下代碼中,對於Person對象,我的compareTo方法比較了年齡並對其進行了排序 在比較方法中,我使用字符串長度(人的姓名)進行排序。理論上,我可以在compareTo方法中完成這兩個操作,正如我在下面實現的那樣。
最後,還有我在兩種方式 1.作爲在主方法註釋掉 2.如匿名對象(?)的靜態方法來實現比較器下面的優於其他 中的一個的任何額外的好處這被註釋掉 3.實現比較新的類並調用類的實例中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);
}
}
感謝
是你說什麼... btw使用'可比較的'與泛型是類型安全的,而不是使用'Object' –
nachokk
使用Comparable接口可以爲一個類的對象定義單個排序順序。 比較器接口用於爲類的對象定義多個排序順序。 – Sanchit