天天看點

根據集合中 某兩個屬性 進行集合排序

使用場景:

某個集合封裝的是 一個uservo對象(比如uservo中有屬性  id, name, priority(優先級) ,pid(部門id))

現在要根據集合中uservo對象的部門優先級先排 然後根據 個人的優先級排,這種情況就可以拼湊一個臨時的vo,

封裝在一個集合中,然後就可以根據以下方法對集合進行排序

當然,有些大牛可以自己拼sql語言,把這個需求按優先級排好,但是我不會,隻想到了下面這個方法,哈哈~~

    private void arrayListSort(List workItemList, final String method, final String method2, final String sort, final String sort2) {

    Collections.sort(workItemList, new Comparator() { 

    public int compare(Object a, Object b) {

    int ret = 0;

    try{

   Method m1 = (a).getClass().getMethod(method, null);

   Method m2 = (b).getClass().getMethod(method, null);

   Method personalNum1 = (a).getClass().getMethod(method2, null);

   Method personalNum2 = (b).getClass().getMethod(method2, null);

   if(m1.invoke((b), null)!=null&&m2.invoke((a), null)==null) {

    return 1;

   }

   if(m1.invoke((b), null)==null&&m2.invoke((a), null)!=null) {

    return -1;

   }

   if(m1.invoke((b), null)==null&&m2.invoke((a), null)==null) {

    return 0;

   }

   if(sort != null && "desc".equalsIgnoreCase(sort)) {//倒序

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

    if(ret==0 && "desc".equalsIgnoreCase(sort2)){

    ret = personalNum2.invoke((b), null).toString().compareTo(personalNum1.invoke((a), null).toString());

    }else if(ret==0 && "asc".equalsIgnoreCase(sort2)){

    ret = personalNum1.invoke((a), null).toString().compareTo(personalNum2.invoke((b), null).toString());

    }

   }else{//正序

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

    if(ret==0 && "desc".equalsIgnoreCase(sort2)){

    ret = personalNum2.invoke((b), null).toString().compareTo(personalNum1.invoke((a), null).toString());

    }else if(ret==0 && "asc".equalsIgnoreCase(sort2)){

    ret = personalNum1.invoke((a), null).toString().compareTo(personalNum2.invoke((b), null).toString());

    }

   }

    }catch(NoSuchMethodException ne){

    System.out.println(ne);

    }catch(IllegalAccessException ie){

    System.out.println(ie);

    }catch(InvocationTargetException it){

    System.out.println(it);

    }

    return ret;

    }

    });

    }