List对象利用属性进行排序的通用工具类

  • 这里继续说有关List对象利用Sort方法进行排序,在java开发中我们经常会使用List进行排序,上篇说到可以每次根据需求编写实现Collections.sort(list, new Comparator() {}) 。然而对于经常通过利用实体类的属性进行比较排序,每次重复写这样的实现很麻烦,下面介绍通用的排序实现。

  • 实体类A

  /** 
   *  
实体类A
   */
public class A{  
    public A( String name, int num) {  
        this.name = name;  
        this.num= num;  
    }  
    private String name;  
    private int num; 

    public String getName() {  
         return name;  
    }  

  public void setName(String name) {  
         this.name= name;    
    }  
   public int getNum() {       
         return num;  
    }  
    public void setNum(int num) {  
         this.num= num; 
    }   
}
  • 排序通用工具类
public class ListSort<E> {  
    /** 
     *  
     * @param list 要排序的集合 
     * @param method 要排序的实体的属性所对应的get方法 
     * @param sort desc 为降序   
     */  
    public void Sort(List<E> list, final String method, final String sort) {  
        // 用内部类实现排序  
        Collections.sort(list, new Comparator<E>() {  

            public int compare(E a, E b) {  
                int ret = 0;  
                try {  
                    // 获取m1的方法名  
                    Method m1 = a.getClass().getMethod(method, null);  
                    // 获取m2的方法名  
                    Method m2 = b.getClass().getMethod(method, null);  

                    if (sort != null && "desc".equals(sort)) {  

                        ret = m2.invoke(((E)b), null).toString().compareTo(m1.invoke(((E)a),null).toString());  

                    } else {  
                        // 升序排序  
                        ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());  
                    }  
                } catch (NoSuchMethodException ne) {  
                    System.out.println(ne);  
                } catch (IllegalArgumentException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                } catch (IllegalAccessException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                } catch (InvocationTargetException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
                return ret;  
            }  
        });  
    }  
}  
  • 方法调用
public static void main(String[] args) {  
        ArrayList<A> listnew ArrayList<A>();  
        list.add(new A("语文",1));  
        list.add(new A("数学",2));  
        list.add(new A("英语",3));  
        ListSort<A> listSort= new ListSort<A>();  
        listSort.Sort(list"getNum""sort");  
        for(A a:list){  
            System.out.println(a.getName());  
        }
  }

总结:按照以上执行(根据Num升序排序)出现顺序就是,语文,数学,英语。
注:这个方法之前在别的地方看过示例略有修改,出处忘了,标为原创,若原作者看到请告知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值