1

作为查询的结果,我有一个来自数据库的 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());

有什么建议么。

4

2 回答 2

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

因此,如果您想要多种类型的比较,请创建多个比较器。然后您可能希望将它们链接在一起 - Guava提供了一种简单的方法来执行此操作。(请参阅ComparisonChain。)为方便起见,您可能希望将比较器实现为内部的私有静态类Employee,然后通过公共静态最终字段公开它们的单个实例:

public class Employee
{
    public static final Comparator<Employee> BY_ID_COMPARATOR
        = new ByIdComparator();

    private static final class ByIdComparator : Comparator<Employee>
    {
        ...
    }
}
于 2012-09-07T16:25:22.640 回答
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;
  }
}
于 2012-09-07T16:27:06.833 回答