【发布时间】: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