Java Efficient对bean集合进行排序的方法

时间:2012-09-07 16:22:11

标签: java sorting collections

我有一个来自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());

任何建议。

2 个答案:

答案 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;
  }
}