<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    非基本數(shù)據(jù)類型對象列表比較器

    寫了一個比較器,實現(xiàn)功能如下:
    有列表List list,list存放對象(如Person p等),對象里面有若干屬性。
    要求對列表按照列表對象的某個屬性進行排序。列表對象類型未知,對象屬性未知。
    通過通知比較器列表對象類型和排序字段,以及升序或降序,來對列表進行排序
    (其實就是實現(xiàn)復(fù)雜對象列表排序)
    注:由于實際應(yīng)用中,要排序的列表結(jié)果集已經(jīng)得到,程序應(yīng)用沒有錯誤或異常,
    比較器只實現(xiàn)排序功能,因此在比較器中封閉異常

    本人實現(xiàn)代碼如下,希望大家提供一些意見來完善

    //比較器總接口類
    package myutil.comparator;

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Comparator;

    public abstract class ListComparator implements Comparator{
        public static final int DATATYPE_STRING=1;//字符串類型
        public static final int DATATYPE_DOUBLE=2;//雙精度浮點型
        public static final int DATATYPE_DATE=3;//日期類型
       
        public static final int ORDER_ASC=100;//順序
        public static final int ORDER_DESC=101;//倒序

        protected String colName="";//被比較的屬性名稱
        protected Class cl=null;//被比較的列表對象的類型
        protected int order=ORDER_ASC;//順序或倒序,默認為順序

           
        /**
         * 比較器的比較方法,在子類中實現(xiàn)
         */
        public abstract int compare(Object o1, Object o2);
           
        /**
         * 獲取兩個比較對象的指定屬性(colName)的值
         * @param obj1 要比較的一個對象
         * @param obj2 要比較的另一個對象
         * @return Object[],被比較的兩個對象中指定屬性的值的數(shù)組
         */
        protected Object[] getValueObj(Object obj1,Object obj2){
            if(obj1==null || obj2==null)
                return null;
            try {           
                int first=colName.charAt(0)-32;//獲得字段名的首字母,并轉(zhuǎn)化成大寫
                String mName="get"+(char)first+colName.substring(1);//獲得字段的獲取方法
                Method m = cl.getMethod(mName,null);//構(gòu)造方法對象
                Object val1=m.invoke(obj1,null);//調(diào)用方法,得到對象1的colName屬性值
                Object val2=m.invoke(obj2,null);//調(diào)用方法,得到對象2的colName屬性值
                return new Object[]{val1,val2};//返回對象數(shù)組
            }  catch (NoSuchMethodException e) {           
                e.printStackTrace();
            } catch (IllegalArgumentException e) {           
                e.printStackTrace();
            } catch (IllegalAccessException e) {           
                e.printStackTrace();
            } catch (InvocationTargetException e) {           
                e.printStackTrace();
            }       
            return null;
        }   

        /**
         * 交換兩個對象,用于控制升序或降序
         * @param obj1
         * @param obj2
         * @return
         */
        protected Object[] swap(Object obj1,Object obj2){
            if(this.order==ORDER_DESC){
                Object oTmp=obj1;
                obj1=obj2;
                obj2=oTmp;           
            }
            return new Object[]{obj1,obj2};
        }
        /**
         * @return 排序方式(順序/倒序)
         */
        public final int getOrder() {
            return order;
        }

        /**
         * @param 排序方式(順序/倒序)
         */
        public final void setOrder(int order) {
            this.order = order;
        }
       
       
        /**
         * @return 列表包裝類型
         */
        public final Class getCl() {
            return cl;
        }

        /**
         * @param 列表包裝類型
         */
        public final void setCl(Class cl) {
            this.cl = cl;
        }

        /**
         * @return 排序字段
         */
        public final String getColName() {
            return colName;
        }

        /**
         * @param 排序字段
         */
        public final void setColName(String colName) {
            this.colName = colName;
        }
       
        public String toString(){
            StringBuffer buf=new StringBuffer();
            buf.append("Column Name(colName):").append(this.colName).append(";");
            buf.append("Class In List Name(c1):").append(cl.getName()).append(";");
            buf.append("Order Type(order):").append(this.order).append(".");
            return buf.toString();
        }
    }

    //工廠類
    package myutil.comparator;

    public class ListComparatorFactory {
       
        public static final ListComparator getListComparator(int dataType){
           
            switch(dataType){
            case ListComparator.DATATYPE_STRING:
                return new StringListComparator();
            case ListComparator.DATATYPE_DOUBLE:
                return new NumberListComparator();
            case ListComparator.DATATYPE_DATE:
                return new DateListComparator();
            default:           
                return new DefaultListComparator();
            }       
        }   
    }
    //默認實現(xiàn)類
    package myutil.comparator;

    public class DefaultListComparator extends ListComparator{
       
        public int compare(Object obj1, Object obj2) {
            Object swapObj[]=this.swap(obj1,obj2);
            Object obj[]=this.getValueObj(swapObj[0],swapObj[1]);
            if(obj==null)
                return 0;
            Comparable cmp1=(Comparable)obj[0];
            Comparable cmp2=(Comparable)obj[1];
            return cmp1.compareTo(cmp2);       
        }
       
        public String toString(){       
            return super.toString();
        }
       
    }


    //比較字段為日期型的實現(xiàn)類
    package myutil.comparator;

    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    public class DateListComparator extends ListComparator{
       
        public int compare(Object obj1, Object obj2) {
            Object swapObj[]=this.swap(obj1,obj2);
            Object obj[]=this.getValueObj(swapObj[0],swapObj[1]);
            if(obj==null)
                return 0;
            DateFormat format=new SimpleDateFormat("yyyyMMddhhmmss");
            Comparable cmp1,cmp2;
            try{
                cmp1=format.parse(obj[0]==null?"00000000000000":obj[0].toString());           
            }catch(ParseException pe){
                cmp1=new Date(0);
            }
            try {
                cmp2=format.parse(obj[1]==null?"00000000000000":obj[1].toString());
            } catch (ParseException e) {
                cmp2=new Date(0);
            }
            return cmp1.compareTo(cmp2);       
        }
       
        public String toString(){       
            return super.toString();
        }
       
    }
    //比較字段為數(shù)字型的實現(xiàn)類,兼容整數(shù),浮點數(shù)
    package myutil.comparator;

    public class NumberListComparator extends ListComparator{
       
        public int compare(Object obj1, Object obj2) {
            Object swapObj[]=this.swap(obj1,obj2);
            Object obj[]=this.getValueObj(swapObj[0],swapObj[1]);
            if(obj==null)
                return 0;
            Comparable cmp1,cmp2;
            try{
                cmp1=new Double(obj[0]==null?"0":obj[0].toString());
            }catch(NumberFormatException nfe){
                cmp1=new Double(0);
            }
            try{
                cmp2=new Double(obj[1]==null?"0":obj[1].toString());
            }catch(NumberFormatException nfe){
                cmp2=new Double(0);
            }
            return cmp1.compareTo(cmp2);       
        }
       
        public String toString(){       
            return super.toString();
        }
       
    }

    //比較字段為字符串型的實現(xiàn)類
    package myutil.comparator;

    public class StringListComparator extends ListComparator{
       
        public int compare(Object obj1, Object obj2) {
            Object swapObj[]=this.swap(obj1,obj2);
            Object obj[]=this.getValueObj(swapObj[0],swapObj[1]);
            if(obj==null)
                return 0;
            Comparable cmp1=obj[0]==null?"":obj[0].toString();
            Comparable cmp2=obj[1]==null?"":obj[1].toString();
            return cmp1.compareTo(cmp2);       
        }
       
        public String toString(){       
            return super.toString();
        }
       
    }

    //應(yīng)用測試示例
    package myutil.comparator.test;

    public class MyFile {

        private int age;
        /**
         * @return the age
         */
        public final int getAge() {
            return age;
        }
        /**
         * @param age the age to set
         */
        public final void setAge(int age) {
            this.age = age;
        }

        public void display() {
            // TODO Auto-generated method stub
           
        }

        public String toString(){
            return String.valueOf(age);
        }
    }

    package myutil.comparator.test;

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

    import myutil.comparator.ListComparator;
    import myutil.comparator.ListComparatorFactory;


    public class SortTest {

        public List doIt(){
            List list=new ArrayList(10);   
            Random ran=new Random();
            for(int i=0;i<10;i++){
                MyFile mf=new MyFile();
                mf.setAge(ran.nextInt(100));
                list.add(mf);
            }
            return list;

        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            SortTest t=new SortTest();
            List list=t.doIt();
            ListComparator cm=ListComparatorFactory.getListComparator(ListComparator.DATATYPE_DOUBLE);
            cm.setColName("age");
            cm.setCl(MyFile.class);
            System.out.println(cm);
            cm.setOrder(ListComparator.ORDER_DESC);
            Collections.sort(list,cm);
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
        }

    }



    posted on 2007-06-12 10:54 hardson 閱讀(1301) 評論(1)  編輯  收藏

    評論

    # re: 非基本數(shù)據(jù)類型對象列表比較器 2007-08-12 17:22 dreamstone

    寫的不錯,不過代碼可以用代碼標簽括起來。  回復(fù)  更多評論   


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲一级毛片免费在线观看| 亚洲妇熟XXXX妇色黄| 亚洲色无码专区一区| 中文毛片无遮挡高潮免费| 精品日韩亚洲AV无码| 97在线视频免费播放| 亚洲精品视频在线播放| 国产h视频在线观看网站免费| 亚洲国产日产无码精品| 成年女人免费视频播放体验区| 亚洲熟女乱色一区二区三区| 国产精品久久香蕉免费播放| 精品在线免费视频| 亚洲男人的天堂一区二区| a级毛片视频免费观看| 亚洲综合色一区二区三区小说| 日日麻批免费40分钟日本的| 亚洲伊人久久大香线蕉AV| 又粗又黄又猛又爽大片免费| 一级午夜a毛片免费视频| 久久亚洲精品中文字幕无码| 国产成人精品免费视频大全麻豆| 91在线亚洲综合在线| 免费在线观看毛片| 无码一区二区三区免费| 亚洲人成电影网站| 免费在线观看中文字幕| 华人在线精品免费观看| 亚洲精品人成网在线播放影院| www.亚洲一区| 久久精品人成免费| 国产AV日韩A∨亚洲AV电影| 亚洲不卡av不卡一区二区| 在线观看免费人成视频色9| 水蜜桃视频在线观看免费| 亚洲天天在线日亚洲洲精| 日韩电影免费在线| 国产精成人品日日拍夜夜免费| 亚洲中文字幕久久精品无码VA| 国产啪亚洲国产精品无码 | 亚洲av无码一区二区乱子伦as|