[英]When to use Comparator and when to use Comparable in Java?
我有一個Employee類,它有3個字段,如下所示。
class Employee
{
private int empId;
private String empName;
private int empAge;
public Employee(int empId, String empName, int empAge) {
this.empId = empId;
this.empName = empName;
this.empAge = empAge;
}
// setters and getters
為此,我想基於員工姓名(empName)進行排序,如果多個員工具有相同的名稱,則根據員工ID(empId)進行排序。
為此,我使用java.util.Comparator編寫了一個自定義比較器,如下所示。
class SortByName implements Comparator<Employee>
{
public int compare(Employee o1, Employee o2) {
int result = o1.getName().compareTo(o2.getName());
if (0 == result) {
return o1.getEmpId()-o2.getEmpId();
} else {
return result;
}
}
}
我創建了8個Employee對象並添加到如下所示的ArrayList中。
List<Employee> empList = new ArrayList<Employee>();
empList.add(new Employee(3, "Viktor", 28));
empList.add(new Employee(5, "Viktor", 28));
empList.add(new Employee(1, "Mike", 19));
empList.add(new Employee(7, "Mike", 19));
empList.add(new Employee(4, "Mark", 34));
empList.add(new Employee(6, "Jay", 34));
empList.add(new Employee(8, "Gayle", 10));
empList.add(new Employee(2, "Gayle", 10));
並使用上面的比較器對列表進行了如下排序。
Collections.sort(empList,new SortByName());
它工作得非常好。 但這可以使用Comparable完成,如下所示。
class Employee implements Comparable<Employee> {
private int empId;
private String name;
private int age;
public Employee(int empId, String name, int age) {
this.empId = empId;
this.name = name;
this.age = age;
}
//setters and getters
@Override
public int compareTo(Employee o) {
int result = this.getName().compareTo(o.getName());
if (0 == result) {
return this.getEmpId()-o.getEmpId();
} else {
return result;
}
}
}
使用Collections.sort(empList)對列表進行排序;
所以我想知道用例是什么或者我們究竟在哪里使用它們? 我知道Comparable用於自然排序,只能使用一個字段排序,比較器用於多個字段排序。 但是如果我們看到我的例子,那么接口都有能力做到這兩點。 所以請解釋一下這兩者的獨特功能,其中一個不能使用。
如果要定義相關對象的默認(自然)排序行為,請使用Comparable ,通常的做法是使用對象的技術或自然(數據庫?)標識符。
如果要定義外部可控排序行為,請使用Comparator ,這可以覆蓋默認排序行為。 您可以定義任意數量的排序行為,您可以根據需要使用這些行為。
有一些類,它們按性質指定一個順序(如String
s [字典順序是事實標准]或Date
s)。 對於這個類,您可以通過實現Comparable<T>
來定義它們的自然順序。 但正如我將要草繪的那樣,很多課程可以通過多種方式進行排序。 為此, Comparator<T>
非常有用。
好的,讓我們看看其他一些例子。 想象一下,如上所述,您有一份Employee
列表,並且您想要做其他一些事情。 例如:您希望能夠靈活地按名稱或按收入或出生日期對它們進行排序或...(想象您想選擇如何訂購它們)。 對於這種情況,您可能希望指定要使用的精確Comparator
,具體取決於您選擇要排序的行。
另一個例子: Employee
類已經存在並指定了一些訂單,但您對此訂單不滿意。 現在,您只需使用Comparator
指定自己的訂單,即可獲得您想要的行為。
如果你真的想知道兩者的獨特功能。
通過實現Comparable,您可以將Class與其他Class進行比較。
Employee implements Comparable<Integer>
比較器是一種比較同一類類型的兩個實例的算法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.