動態排序JavaBean


Java中如果對對象排序可以考慮實現Comparable接口,但是需要排序的屬性一旦指定就不能再修改。BeanUtils組件提供了對JavaBean動態排序的支持,即可以在運行時指定排序的屬性。實例運行效果如圖

BeanComparator通過指定的屬性來比較兩個bean。它也可以用來比較級聯屬性、索引屬性、映射屬性和組合屬性等。BeanComparator默認把指定的bean屬性傳遞給ComparableComparator。如果比較的屬性值可能有空值,那么應該傳遞一個合適的Comparator或ComparatorChain給構造方法。

技巧:利用Collections組件的ComparatorUtils類可以實現含有空值的排序,請讀者參考相關的API

(1)編寫Employee類,該類定義了3個域:id表示員工的序號,name表示員工的姓名,salary表示員工的薪水,並且提供了相應的getset方法。代碼如下:

 

 private int id;
    private String name;
    private double salary;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public double getSalary() {
        return salary;
    }
    
    public void setSalary(double salary) {
        this.salary = salary;
    }
    
    @Override
    public String toString() {
        return "員工編號:" + id + ",員工姓名:" + name + ",員工工資:" + salary;
    }
}

 

2)編寫Test類,在該類的main()方法中創建了3Employee對象並進行初始化,然后使用salary域進行排序。代碼如下:

 

 

package com.mingrisoft.beanutils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.beanutils.BeanComparator;

public class Test {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        Employee employee1 = new Employee();// 創建employee1對象並初始化
        employee1.setId(1);
        employee1.setName("IBM");
        employee1.setSalary(10000);
        Employee employee2 = new Employee();// 創建employee2對象並初始化
        employee2.setId(2);
        employee2.setName("Oracle");
        employee2.setSalary(1000);
        Employee employee3 = new Employee();// 創建employee3對象並初始化
        employee3.setId(3);
        employee3.setName("Sun");
        employee3.setSalary(100);
        List<Employee> list = new ArrayList<Employee>();// 創建list對象並保存全部員工對象
        list.add(employee1);
        list.add(employee2);
        list.add(employee3);
        System.out.println("排序前:");
        for (Employee employee : list) {
            System.out.println(employee);// 輸出所有對象
        }
        Collections.<Employee> sort(list, new BeanComparator("salary"));// 進行排序
        System.out.println("按工資排序后:");
        for (Employee employee : list) {
            System.out.println(employee);// 輸出所有對象
        }
    }
}

 

心法領悟:動態排序的原理。

BeanComparator實現了Comparator接口,利用反射根據指定的屬性值來排序。使用該類的方法比自己實現該功能要好很多,希望讀者認真掌握。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM