1. 程式人生 > >JAVA 物件陣列按照多個屬性進行排序

JAVA 物件陣列按照多個屬性進行排序

下文可以直接拿來執行使用,也可以直接下載附件包,編譯直接執行就可以看到效果。

//ObjectSort

package sort;

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

public class ObjectSort {
    /**
     * @param args
     */
    public static void main(String[] args) {
        /**
         *

         * purpose: 根據物件的某個或者某些屬性排序
         * Java裡面包含8個基本資料型別,分別是:boolean、byte、char、short、int、float、douboe、long
         * 只比較非boolean和byte型別的屬性,和大多數運用環境適應,如果有特殊要求,請自己修改。
         * 使用時只要將物件屬性列表和需要排序的List傳入即可
         * **/
        List arrayDemo = new ArrayList();
       
        Person p1 = new Person();
        p1.setName("zhang san");
        p1.setAge(22);
        p1.setSalary(160);
       
        Person p2 = new Person();
        p2.setName("zhang san");
        p2.setAge(22);
        p2.setSalary(150);
       
        Person p3 = new Person();
        p3.setName("zhang san");
        p3.setAge(25);
        p3.setSalary(1900);
       
        Person p4 = new Person();
        p4.setName("zhao liu");
        p4.setAge(25);
        p4.setSalary(3000);
       
        Person p5 = new Person();
        p5.setName("liu qi");
        p5.setAge(30);
        p5.setSalary(2000);
       
        arrayDemo.add(p1);
        arrayDemo.add(p2);
        arrayDemo.add(p3);
        arrayDemo.add(p4);
        arrayDemo.add(p5);
       
        //*********開始比較********//
        CommonComparator comparator = new CommonComparator();
        System.out.println("1.sort by name, age and salary");
        comparator.setFields_user(new String[]{"name","age","salary"});
        Collections.sort(arrayDemo, comparator);
        for(int i=0;i<arrayDemo.size();i++)
        {
            Person person = (Person)arrayDemo.get(i);
            System.out.println("name:"+person.getName()+" age:"+person.getAge()+" salary:"+person.getSalary());
        }
        
        System.out.println("1.sort by name, age");
        comparator.setFields_user(new String[]{"name","age"});
        Collections.sort(arrayDemo, comparator);
        for(int i=0;i<arrayDemo.size();i++)
        {
            Person person = (Person)arrayDemo.get(i);
            System.out.println("name:"+person.getName()+" age:"+person.getAge()+" salary:"+person.getSalary());
        }
    }

}

//CommonComparator

package sort;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.CollationKey;
import java.text.Collator;
import java.util.Comparator;

public class CommonComparator implements Comparator {

    /***
     * @param
     * 比較物件的屬性用String[]的形式傳過來
     * 比較的物件一定要符合javaBean,即要有Set,Get方法
     * */
    String[] fields_user = null;
   
   
    public String[] getFields_user() {
        return fields_user;
    }
    public void setFields_user(String[] fields_user) {
        this.fields_user = fields_user;
    }
    /**
     * 定義排序規則
     * 如果按照不止一個屬性進行排序
     * 這按照屬性的順序進行排序,類是sql order by
     * 即只要比較出同位置的屬性就停止
     * */
    public int compare(Object obj1, Object obj2)
    {
        //沒有屬性,則不排序
        if(fields_user == null || fields_user.length<=0)
        {
            return 2;//不比較
        }
        for(int i=0;i<fields_user.length;i++)
        {
            //return compareField(obj1,obj2,fields_user[i]);
            if(compareField(obj1,obj2,fields_user[i])>0)
            {//如果obj1的屬性值大於obj2的屬性值,則返回正數
                return 1;
             }else if(compareField(obj1,obj2,fields_user[i])<0){
                 return -1;
             }
        }
        return 0;
    }
    /**
     * @param fieldName
     * 根據屬性名排序
     * */
    private static int compareField(Object o1,Object o2,String fieldName)
    {
            try
            {
                Object value1 = getFieldValueByName(fieldName,o1);
                Object value2 = getFieldValueByName(fieldName,o2);
              
                //--字串比較
                if(value1 instanceof String)
                {
                  String v1 = getFieldValueByName(fieldName,o1).toString();
                  String v2 = getFieldValueByName(fieldName,o2).toString();
                    Collator myCollator = Collator.getInstance();
                    CollationKey[] keys = new CollationKey[5];
                    keys[0] = myCollator.getCollationKey(v1);
                    keys[1] = myCollator.getCollationKey(v2);
                    return (keys[0].compareTo(keys[1]));
                }
                //--非比較屬性不比較
                else if("java.lang.Boolean".equals(value1.getClass().getName()) || "java.lang.Byte".equals(value1.getClass().getName()))
                {
                    return 0;
                }else
                {
                    BigDecimal b1 = new BigDecimal(value1.toString());
                    BigDecimal b2 = new BigDecimal(value2.toString());
                    return b1.compareTo(b2);
                }

            } catch (Exception e)
            {
                System.out.println("-----------------------------------------------------------------------------");
                System.out.println("---------物件的該屬性不存在或者不允許在此安全級別上反射該屬性,詳情請查閱JAVA DOC--------");
                System.out.println("-----------------------------------------------------------------------------");
                e.printStackTrace();
            }
            //小於
            return -1;
    }
    /**
     * @param
     * fieldName 屬性名
     * obj 物件
     * 反射獲得該屬性的值
     * */
    private static Object getFieldValueByName(String fieldName,Object obj)
    {
        try
        {
            String Letter = fieldName.substring(0,1).toUpperCase();
            String methodStr = "get"+Letter+fieldName.substring(1);
            Method method = obj.getClass().getMethod(methodStr, new Class[]{});
   
            Object value = method.invoke(obj, new Object[]{});
            
            return value;
        }catch(Exception e)
        {
            System.out.println("------------------------------------------------------");
            System.out.println("---------該"+fieldName+"屬性不存在----------------------");
            System.out.println("------------------------------------------------------");
            return null;
        }
    }


}

//Person

package sort;

public class Person {
    public Person(){}
    
    private String name;
    private int age;
    private long salary;
   
    public long getSalary() {
        return salary;
    }
    public void setSalary(long salary) {
        this.salary = salary;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}