何时在Java中使用Comparator,何时使用Comparable?

3
我有一个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个员工对象,并像下面这样添加到一个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用于自然排序,只能使用一个字段进行排序,而comparator用于多个字段排序。但是如果我们看到我的示例,这两个接口都具有执行这两个操作的能力。因此,请解释一下这两个接口的独特功能,其中另一个无法使用的功能。

3个回答

2

如果你想定义一个对象的默认(自然)排序行为,可以使用Comparable。一种常见做法是使用对象的技术或自然(数据库?)标识符进行排序。

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


0

如果你真的想知道两者的独特功能。

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

Employee implements Comparable<Integer>

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


0

有些类可以根据它们的本质(如字符串[词典顺序是事实标准]或日期)指定顺序。对于这些类,您可以通过实现 Comparable<T> 来定义它们的自然排序。但正如我将要概述的那样,很多类可以按不止一种方式排序。为此,Comparator<T> 非常有用。

好的,让我们看一些其他的例子。假设您有一个像您提到的 Employee 列表,并且您想要做一些其他的事情。例如:您想要灵活地按名称、收入、出生日期等对它们进行排序... (想象您想要选择如何对它们进行排序)。对于这种情况,您可能希望根据您选择的行来指定要使用的确切 Comparator

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接