【问题标题】:When to use Comparator and when to use Comparable in Java?在 Java 中何时使用 Comparator 以及何时使用 Comparable?
【发布时间】:2015-09-06 14:23:12
【问题描述】:

我有一个 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 用于自然排序,并且可以仅使用一个字段进行排序,而比较器用于多个字段排序。但是,如果我们看到我的示例,这两个接口都有能力做到这两个。所以请解释一下这两者有哪些独特的功能,其他的不能用。

【问题讨论】:

    标签: java sorting comparator comparable


    【解决方案1】:

    如果要定义相关对象的默认(自然)排序行为,请使用 Comparable,通常的做法是为此使用对象的技术或自然(数据库?)标识符.

    如果你想定义一个外部可控的排序行为,使用Comparator,这可以覆盖默认的排序行为。您可以定义任意数量的排序行为,您可以根据需要使用它们。

    【讨论】:

      【解决方案2】:

      如果你真的想知道两者的独特之处。

      实现 Comparable 让您可以将您的类与其他类进行比较。

      Employee implements Comparable<Integer>
      

      比较器是一种比较同一类类型的两个实例的算法。

      【讨论】:

        【解决方案3】:

        有些类根据它们的性质指定顺序(如Strings [字典顺序是事实上的标准] 或Dates)。对于此类,您可以通过实现Comparable&lt;T&gt; 来定义它们的自然顺序。但正如我将概述的那样,很多课程可以通过不止一种方式进行排序。为此,Comparator&lt;T&gt; 非常有用。

        好的,让我们看看其他示例。想象一下,您有一个 Employee 列表,正如您所提到的,您想做一些其他的事情。例如:您希望灵活地按姓名或收入或出生日期或...(假设您想选择如何排序)对它们进行排序。对于这种情况,您可能需要指定要使用的确切 Comparator,具体取决于您选择要排序的行。

        另一个例子:Employee 类已经存在并且确实指定了一些顺序,但是您对这个顺序不满意。现在您可以简单地使用Comparator 指定您自己的订单并获得您想要的行为。

        【讨论】:

          猜你喜欢
          • 2011-01-17
          • 2020-11-22
          • 2014-04-04
          • 2012-11-12
          • 1970-01-01
          • 1970-01-01
          • 2018-11-11
          • 2014-11-07
          • 1970-01-01
          相关资源
          最近更新 更多