分享

java对象属性排序,支持中英文字符串和数字

 jp乞巧楼 2015-07-30

废话不多说,该类主要实现按对象属性将对象排序,排序可以按任意多属性进行排序,类似sql的order by,还可以设置排序是升序还是降序。

 

 

[c-sharp] view plaincopy
  1. import java.lang.reflect.Method;  
  2. import java.text.Collator;  
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.Comparator;  
  6. import java.util.List;  
  7.   
  8. /** 
  9.  * @author 邬小洪 QQ:16044171 
  10.  * @version 1.0,2010-7-24 
  11.  */  
  12. public class MyComparator implements Comparator {  
  13.     private Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);  
  14.   
  15.     private String[] sortBy;  
  16.   
  17.     private int order;  
  18.   
  19.     private MyComparator(String[] sortBy, int order) {  
  20.         this.sortBy = sortBy;  
  21.         this.order = order;  
  22.     }  
  23.   
  24.     /* 
  25.      * 定义排序规则 如果按照不止一个属性进行排序 这按照属性的顺序进行排序,类似sql order by 即只要比较出同位置的属性就停止 
  26.      */  
  27.     public int compare(Object o1, Object o2) {  
  28.         for (int i = 0; i < sortBy.length; i++) {  
  29.             Object value1 = getFieldValueByName(sortBy[i], o1);  
  30.             Object value2 = getFieldValueByName(sortBy[i], o2);  
  31.             if (value1 instanceof Integer && value2 instanceof Integer) {  
  32.                 int v1 = Integer.parseInt(value1.toString());  
  33.                 int v2 = Integer.parseInt(value2.toString());  
  34.                 if (v1 > v2) {  
  35.                     return 1 * this.order;  
  36.                 } else if (v1 < v2) {  
  37.                     return -1 * this.order;  
  38.                 }  
  39.             } else {  
  40.                 int result = cmp.compare(value1, value2);  
  41.                 if (result != 0) {  
  42.                     return result * this.order;  
  43.                 }  
  44.             }  
  45.         }  
  46.         return -1 * this.order;  
  47.     }  
  48.   
  49.     /** 
  50.      *  
  51.      * 通过反射,获取属性值 
  52.      *  
  53.      * @param fieldName 
  54.      * @param o 
  55.      * @return 
  56.      */  
  57.     private Object getFieldValueByName(String fieldName, Object o) {  
  58.         try {  
  59.             String firstLetter = fieldName.substring(0, 1).toUpperCase();  
  60.             String getter = "get" + firstLetter + fieldName.substring(1);  
  61.             Method method = o.getClass().getMethod(getter, new Class[] {});  
  62.   
  63.             Object value = method.invoke(o, new Object[] {});  
  64.             return value;  
  65.         } catch (Exception e) {  
  66.             System.out.println("属性不存在");  
  67.             return null;  
  68.         }  
  69.     }  
  70.   
  71.     /** 
  72.      *  
  73.      * 待排序对象 
  74.      *  
  75.      * @author 邬小洪 QQ:16044171 
  76.      * @version 1.0,2010-7-24 
  77.      */  
  78.     private static class Bean {  
  79.         private String name = null;  
  80.   
  81.         private String post = null;  
  82.   
  83.         private Integer age = null;  
  84.   
  85.         public Integer getAge() {  
  86.             return age;  
  87.         }  
  88.   
  89.         public void setAge(Integer age) {  
  90.             this.age = age;  
  91.         }  
  92.   
  93.         public String getPost() {  
  94.             return post;  
  95.         }  
  96.   
  97.         public void setPost(String post) {  
  98.             this.post = post;  
  99.         }  
  100.   
  101.         public String getName() {  
  102.             return name;  
  103.         }  
  104.   
  105.         public void setName(String name) {  
  106.             this.name = name;  
  107.         }  
  108.     }  
  109.   
  110.     public static void main(String[] args) {  
  111.         Bean b1 = new Bean();  
  112.         b1.setName("邬小洪");  
  113.         b1.setPost("研发工程师");  
  114.         b1.setAge(26);  
  115.   
  116.         Bean b2 = new Bean();  
  117.         b2.setName("小洪");  
  118.         b2.setPost("部署工程师");  
  119.         b2.setAge(27);  
  120.   
  121.         Bean b3 = new Bean();  
  122.         b3.setName("洪儿");  
  123.         b3.setPost("部署工程师");  
  124.         b3.setAge(28);  
  125.           
  126.         Bean b4 = new Bean();  
  127.         b4.setName("邬小洪");  
  128.         b4.setPost("架构工程师");  
  129.         b4.setAge(27);  
  130.   
  131.         List<Bean> list = new ArrayList<Bean>();  
  132.         list.add(b1);  
  133.         list.add(b2);  
  134.         list.add(b3);  
  135.         list.add(b4);  
  136.   
  137.         String[] sortBy = new String[] { "name", "post" };  
  138.         int orderBy = 1;//1:升序,-1:降序  
  139.         MyComparator myCmp = new MyComparator(sortBy, orderBy);  
  140.         Collections.sort(list, myCmp);  
  141.         System.out.println("--------------------按名字和职位升序----------------------------");  
  142.         for (Bean b : list) {  
  143.             System.out.println("name:" + b.getName() + ",post:" + b.getPost()  
  144.                     + ",age:" + b.getAge());  
  145.         }  
  146.   
  147.         sortBy = new String[] { "post", "age" };  
  148.         myCmp = new MyComparator(sortBy, orderBy);  
  149.         Collections.sort(list, myCmp);  
  150.         System.out.println("--------------------按职位和年龄升序----------------------------");  
  151.         for (Bean b : list) {  
  152.             System.out.println("post:" + b.getPost() + ",age:" + b.getAge()  
  153.                     + ",name:" + b.getName());  
  154.         }  
  155.   
  156.         sortBy = new String[] { "age", "name" };  
  157.         myCmp = new MyComparator(sortBy, orderBy);  
  158.         Collections.sort(list, myCmp);  
  159.         System.out.println("--------------------按年龄和名字升序----------------------------");  
  160.         for (Bean b : list) {  
  161.             System.out.println("age:" + b.getAge() + ",name:" + b.getName()  
  162.                     + ",post:" + b.getPost());  
  163.         }  
  164.     }  
  165. }  

 

运行结果:

--------------------按名字和职位升序----------------------------
name:洪儿,post:部署工程师,age:28
name:小洪,post:部署工程师,age:27
name:邬小洪,post:研发工程师,age:26
name:邬小洪,post:架构工程师,age:27
--------------------按职位和年龄升序----------------------------
post:部署工程师,age:27,name:小洪
post:部署工程师,age:28,name:洪儿
post:架构工程师,age:27,name:邬小洪
post:研发工程师,age:26,name:邬小洪
--------------------按年龄和名字升序----------------------------
age:26,name:邬小洪,post:研发工程师
age:27,name:小洪,post:部署工程师
age:27,name:邬小洪,post:架构工程师
age:28,name:洪儿,post:部署工程师

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多