簡體   English   中英

何時使用Comparator以及何時在Java中使用Comparable?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM