0

Beanのコレクションがあり、それをempld、dept、projectでソートし、カスタムコンパレータを使用してソートし、apacheコレクションComparatorChainを使用してこのBeanのリストをソートするとします。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(2回表示される可能性があります)に対して、顧客名がUniversityの同じem​​pIdの下に移動する必要があるとします。顧客の記録が整理されていない可能性があるため、誰でも最初に表示される可能性があります。

したがって、基本的に、同じempIdを持つ2つ以上のレコードがあり、そのうちの1つにcustomer = Companyがある場合は、同じempIdを持つ注文の下に移動します。

カスタムソート

効率的で可能なスレッドセーフな方法で、このレコードのスワッピング/再配置をどのように実現できますか。

4

2 に答える 2

0

コレクション内のレコードを並べ替える場合は、そのオブジェクトクラスにコンパレータを実装させ、必要に応じてメソッドを実装させる必要があります。

于 2012-09-09T18:29:38.770 に答える
0

私はこの問題を次のように解決しました:

  1. Comparatorを実装し、Company、Government、Universityの比較メソッドを持つ別のコンパレータクラスを作成できます。

  2. 次のように、Company、Government、UniversityのEmployeeクラス内にクリエーターコンパレータメソッドを作成できます。

    public static Comparator COMPARE_BY_COMPANY = new Comparator(){public int compare(Employee o1、Employee 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);    
        }
    };
    

最初のアプローチの方が優れていますが、2番目のアプローチも害はありません。

次に、カスタムの並べ替え順序が必要なクラスで、次のようにします。

 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です。

上記のコードは、会社、政府、大学の順に並べ替え、最後にリストを並べ替えると、結果がこの順序で表示されます。

于 2013-03-28T03:24:35.627 に答える