根据集合中 某两个属性 进行集合排序

时间:2022-05-29 19:26:32

使用场景:

某个集合封装的是 一个uservo对象(比如uservo中有属性  id, name, priority(优先级) ,pid(部门id))

现在要根据集合中uservo对象的部门优先级先排 然后根据 个人的优先级排,这种情况就可以拼凑一个临时的vo,

封装在一个集合中,然后就可以根据以下方法对集合进行排序

当然,有些大牛可以自己拼sql语言,把这个需求按优先级排好,但是我不会,只想到了下面这个方法,哈哈~~


   /**

    * 通用集合排序
    * @param workItemList
    * @param method  按workItemList中的第一个属性排序  workItemList中实体的get方法的属性
    * @param method2 按workItemList中的第二个属性排序 workItemList中实体的get方法的属性
    * @param sort 第一个属性排序规则 升 or 降
    * @param sort2  第二个属性排序规则 升 or 降
    */
    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;
    }
    });
    }