class Employee implements Comparable{
private String name;
private String gender;
Employee(String name, String gender) {
this.name = name;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String toString() {
return this.getName() + " : " + this.getGender();
}
@Override
public int compareTo(Object o) {
int gendarComp=this.getGender().compareTo(((Employee)o).getGender());
return (gendarComp!=0?gendarComp:this.name.compareTo(((Employee)o).getName()));
}
}
class EmployeeExec {
public static void main(String[] args) {
List allEmpls = new ArrayList();
allEmpls.add(new Employee("vijay", "m"));
allEmpls.add(new Employee("balaji", "m"));
allEmpls.add(new Employee("shaifali", "f"));
allEmpls.add(new Employee("archana", "f"));
allEmpls.add(new Employee("alala", "m"));
allEmpls.add(new Employee("kiran", "f"));
sortEmployees(allEmpls);
}
public static void sortEmployees(List allEmpls) {
Collections.sort(allEmpls);
System.out.println(allEmpls);
}
}
任何人都可以帮助我了解它是如何工作的吗?排序的基础是什么?我保留了一些 println 语句来查看,但我不太明白它是如何被调用的。我知道它与合并排序一起使用。但如何呢?
排序基于
compareTo
的返回值(为了可读性稍微重新格式化):
@Override
public int compareTo(Object o) {
int gendarComp = this.getGender().compareTo(((Employee)o).getGender());
return (gendarComp != 0
? gendarComp
: this.name.compareTo( ((Employee)o).getName() )
);
}
逻辑显然是比较
getGender()
的值并返回该比较,除非它们测试相等。如果相等,则返回比较名称的结果。
顺便说一句:如果这是您的代码,最好使用泛型而不是原始类型。声明
class Employee implements Comparable<Employee> {...
然后使用签名声明
compareTo
方法:
@Override
public int compareTo(Employee o) {...
并且您可以省去方法内的强制转换(以及提高客户端代码中的类型安全性)。
@Override
public int compareTo(Object o) {
int gendarComp=this.getGender().compareTo(((Employee)o).getGender());
return (gendarComp!=0 ?
gendarComp
: this.name.compareTo(((Employee)o).getName()));
}
如您所见,代码首先比较性别。
如果性别相等,则结果为0,然后按名称作为辅助排序键进行比较。
已经有两个人解释了compareTo()方法的作用,但是既然你说了
但我不太明白它是如何被调用的
我会解释那部分。当调用 Collections.sort(allEmpls) 时,所有列表对象的compareTo() 方法都会相互调用,因为它们都实现了 Comparable 接口。然后,sort() 方法中的代码根据对象的compareTo() 值重新组织对象。就是这样(当然,过于简化,但它回答了你的问题)。