我有一个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用于自然排序,只能使用一个字段排序,比较器用于多个字段排序。但是如果我们看到我的例子,那么接口都有能力做到这两点。所以请解释一下这两者的独特之处在于哪一个都无法使用。
答案 0 :(得分:2)
如果要定义相关对象的默认(自然)排序行为,请使用可比较,通常的做法是使用对象的技术或自然(数据库?)标识符
如果要定义外部可控排序行为,请使用比较器,这可以覆盖默认排序行为。您可以定义任意数量的排序行为,您可以根据需要使用这些行为。
答案 1 :(得分:0)
有些类,它们按性质指定顺序(如String
s [词典顺序是事实上的标准]或Date
s)。对于这些类,您可以通过实现Comparable<T>
来定义它们的自然顺序。但正如我将要草绘的那样,很多课程可以通过多种方式进行排序。为此,Comparator<T>
非常有用。
好的,让我们看看其他一些例子。想象一下,如前所述,您有一个Employee
列表,并且您想要做其他一些事情。例如:您希望能够灵活地按名称或按收入或出生日期对它们进行排序或...(想象您想选择如何订购它们)。对于这种情况,您可能希望指定要使用的确切Comparator
,具体取决于您选择要排序的行。
另一个例子:Employee
类已经存在并指定了一些顺序,但您对此顺序不满意。现在,您只需使用Comparator
指定自己的订单,即可获得您想要的行为。
答案 2 :(得分:0)
如果你真的想知道两者的独特功能。
实施Comparable可让您将您的班级与其他班级进行比较。
Employee implements Comparable<Integer>
比较器是一种比较同一类类型的两个实例的算法。