如何为特定值重新排列bean集合中的元素

时间:2012-09-08 17:49:15

标签: java list collections

假设我有一个bean的集合,它由empld,dept,project帮助,为它编写自定义比较器,并使用apache集合ComparatorChain对这个bean的列表进行排序。豆子如下。

public class Employee  {

    protected String empId; //alphanumeric e.g.abc123
    protected String empFullName;   
    protected String empAddress;
    protected String dept;
    protected String project;
    protected String customer;

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

    public String getCustomer() {
        return customer;
    }
    public void setCustomer(String customer) {
        this.customer = customer;
    }


}

客户价值观可以是:公司,政府,大学

现在假设集合中有成千上万的记录(bean),现在我想要的是同一个empId(可以出现两次),如果客户是公司移动,在同一个客户名称大学的下方。客户的记录可能不是有序的,所以任何人都可以先出现等等。

所以基本上我想移动,如果两个或多个具有相同empId的记录,其中一个具有customer = Company,则将其移动到具有相同empId的订单下方 e.g。

Custom Sort

如何以高效且可能的线程安全方式实现记录的交换/重新排列。

2 个答案:

答案 0 :(得分:0)

如果要对集合中的记录进行排序,则需要让该对象类根据需要实现比较器和实现方法。

答案 1 :(得分:0)

我解决了这个问题如下:

  1. 您可以创建一个单独的比较器类来实现Comparator和  有比较方法公司,政府,大学。

  2. 您可以在Employee类中创建创建者比较器方法 公司,政府,大学是这样的:

    public static Comparator COMPARE_BY_COMPANY = new Comparator() {         public int compare(员工o1,员工o2)         {

            if (o1.company == null && o2.company == null) return 0;   
    
            if (o1.company != null && o2.company == null) return -1;
            if (o1.company == null && o2.company != null) return 1;
    
            return o1.company.compareTo (o2.company);    
        }
    };
    
  3. 虽然第一种方法更好,但第二种方法也没有危害。

    然后在您想要自定义排序顺序的类中,执行以下操作:

     ComparatorChain chain = new ComparatorChain();
                 chain.addComparator(Employee.COMPARE_BY_COMPANY);
                 chain.addComparator(Employee.COMPARE_BY_GOVERNMENT);
                 chain.addComparator(Employee.COMPARE_BY_UNIVERSITY);
    
    
                 Collections.sort(EmployeeList, chain);
    

    其中ComparatorChain是org.apache.commons.collections.comparators.ComparatorChain。

    上述代码将做的是它将按公司排序,然后由政府排序,然后由大学排序,最后将对列表进行排序,结果将按顺序显示。