我有一个来自db的bean列表,这是查询的结果。
bean如下:
public class Employee implements Comparator<Employee> {
protected String empId; //alphanumeric e.g.abc123
protected String empFullName;
protected String empAddress;
protected String dept;
protected String project;
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
public String getEmpFullName() {
return empFullName;
}
public void setEmpFullName(String empFullName) {
this.empFullName = empFullName;
}
public String getEmpAddress() {
return empAddress;
}
public void setEmpAddress(String empAddress) {
this.empAddress = empAddress;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getProject() {
return project;
}
public void setProject(String project) {
this.project = project;
}
@Override
public int compare(Employee e1, Employee e2) {
if (e1 == null && e2 == null) return 0;
if (e1 != null && e2 == null) return -1;
if (e1 == null && e2 != null) return 1;
return e1.empId.compareTo (e2.empId);
}
}
我有比较器,它通过empId进行排序,这是一个字母数字。
我想知道empId,dept,project对它进行排序的最佳方法是什么。
如果我按照以下方式执行代码,则按empId进行排序。
List<Employee> empList = someDao.getEmpList();
Collections.sort(empList, new Employee());
任何建议。
答案 0 :(得分:5)
这本身就是一个奇怪的声明:
public class Employee implements Comparator<Employee>
拥有以下内容会更为常见:
public class Employee implements Comparable<Employee>
然后可能:
public class EmployeeByIdComparator implements Comparator<Employee>
和
public class EmployeeByNameComparator implements Comparator<Employee>
等
实现Comparable
的类的实例知道如何将本身与另一个实例进行比较;通常这是为“自然”排序保留的。将其与Comparator
的实例进行比较,Comparator
知道如何比较两个实例通常是不同的类型(指定为{{1的类型参数的实例) }})。
因此,如果您想要多种类型的比较,请创建多个比较器。然后,您可能希望将它们链接在一起 - Guava提供了一种简单的方法。 (参见ComparisonChain
。)为方便起见,您可能希望将比较器实现为Employee
中的私有静态类,然后通过公共静态最终字段公开它们的单个实例:
public class Employee
{
public static final Comparator<Employee> BY_ID_COMPARATOR
= new ByIdComparator();
private static final class ByIdComparator : Comparator<Employee>
{
...
}
}
答案 1 :(得分:0)
public class Employee implements Comparator<Employee>
这是Comparator
接口的错误(可能不是故意的)使用。我想你想要Comparable
。
要按empId进行排序,dept和project会创建一个自定义比较器来执行此操作并将其传递给sort()
方法。然后,这个比较器只需按您需要的顺序检查您想要比较的属性,并在第一次不是0时返回结果 - 或者如果所有属性相等则返回结果。
示例:
new Comparator<Employee>() {
public int compare(Employee e1, Employee e2) {
//check if both are not null
int result = e1.empId.compareTo( e2.empId );
if( result == 0) {
result = e1.dept .compareTo( e2.dept );
}
...
return result;
}
}