Java对象排序

实现Comparator接口-->Collections.sort(List, new ComparaObject());

public class ComparaObject implements Comparator<User>{

    @Override
    public int compare(User o1, User o2) {
         
          String user1_name = StringUtil.toHanyuPinyin(o1.getName());
          String user2_name = StringUtil.toHanyuPinyin(o2.getName());
        
          int b_photo = o1.getIsHavePhoto().compareTo(o2.getIsHavePhoto());
          int b_contact = o1.getIsContact().compareTo(o2.getIsContact());
          int b_name = user1_name.compareTo(user2_name);
          
       
         if (b_photo ==0) { //先按照是否有照片排序
                   
               if(b_contact == 0) {//再按照是否是联系人排
               return b_name;
            }else  {
                return -b_contact;  //最后按照name的拼音升序
            }
        }else {
            return -b_photo;
        }
    }
}

工具类

//调用
  List<SortDescription> sortDesList = new ArrayList<SortDescription>(); 
 sortDesList.add(new SortDescription("isHavePhoto",false));       //根据isHavePhoto降序
 sortDesList.add(new SortDescription("isContact",false));         //根据isContact降序
 sortDesList.add(new SortDescription("name",true));               //根据name升序

 Collections.sort(users, new ComparaObject(sortDesList));  
//实现
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Comparator;
import java.util.List;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;


class SortDescription {
    
    private String fildName;
    private Boolean isAsc;
    
    
    public SortDescription(String fildName, Boolean isAsc) {
        super();
        this.fildName = fildName;
        this.isAsc = isAsc;
    }


    public String getFildName() {
        return fildName;
    }


    public void setFildName(String fildName) {
        this.fildName = fildName;
    }


    public Boolean getIsAsc() {
        return isAsc;
    }


    public void setIsAsc(Boolean isAsc) {
        this.isAsc = isAsc;
    }

}

public class ComparaObject implements Comparator<Object>{

    private List<SortDescription> sortDesList;

    public List<SortDescription> getSortDesList() {
        return sortDesList;
    }

    public void setSortDesList(List<SortDescription> sortDesList) {
        this.sortDesList = sortDesList;
    }

    public ComparaObject(List<SortDescription> sortDesList) {
        super();
        this.sortDesList = sortDesList;
    }

    int comparaTwoObj(SortDescription des, Object o1, Object o2) {
        
        String value1 = null;
        String value2 = null;
         try {
             value1 = hendleReturnValue(o1, des.getFildName());
             value2 = hendleReturnValue(o2, des.getFildName());
             
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int compara =  toHanyuPinyin(value1).compareTo(toHanyuPinyin(value2));
        
        return compara;
    }
    
    private String hendleReturnValue(Object obj, String fildName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        
        String methodName = "get" + fildName.substring(0, 1).toUpperCase() + fildName.substring(1);  
        
         Object obj1 = InvokeWithObj(obj, methodName, null);
         if (obj1 instanceof String) {
             return  (String) obj1;
        }else {
            return  obj1 + "";
        }
    }
    
    @Override
    public int compare(Object o1, Object o2) {
        
    for (int i = 0; i < this.sortDesList.size(); i++) {
        
        SortDescription des = this.sortDesList.get(i);
        
        int compara = comparaTwoObj(des, o1, o2);
        
        if (compara != 0) {
            return des.getIsAsc() == true ? compara : -compara;
        }else {
           continue;    
        }
    }   
    return 0;
  }

    
     //根据对象,方法名,参数调用方法
       private Object InvokeWithObj (Object obj, String methodName, Object ...args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
          
                Class prams[] =  getPramsClass(args);
                Method method = getKindOfClassMethod(obj.getClass(),methodName,prams);
                method.setAccessible(true); //设置可以访问私有方法
                Object returnObj = method.invoke(obj, args);
                return  returnObj;
         } 
       //根据参数对象数组获取参数类数组
       private Class[] getPramsClass ( Object ...args){
            
            if (args == null) {
                return null;
            }
            
             Class[] prams = new Class[args.length];
                for (int i = 0; i < args.length; i++) {
                    prams[i] = args[i].getClass();
                }
                return prams;
        } 
        //获取类的指定方法,子类没有向父类找 
         private Method getKindOfClassMethod(Class cls, String methodName, Class[] prams) {
                
               Method method = null;
               Class clazz = cls;
               while (method == null && clazz != Object.class) {
                  try {
                     method = clazz.getDeclaredMethod(methodName, prams);   
                  } catch (NoSuchMethodException e) {
                     e.printStackTrace();
                     clazz = clazz.getSuperclass();
                 } 
           }
             return method;
     } 
         private String toHanyuPinyin(String ChineseLanguage){
             if (ChineseLanguage == null) {
                return "";
            }
                char[] cl_chars = ChineseLanguage.trim().toCharArray();
                String hanyupinyin = "";
                HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
                defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出拼音全部小写
                defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不带声调
                defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V) ;
                try {
                    for (int i=0; i<cl_chars.length; i++){
                        if (String.valueOf(cl_chars[i]).matches("[\u4e00-\u9fa5]+")){// 如果字符是中文,则将中文转为汉语拼音
                            hanyupinyin += PinyinHelper.toHanyuPinyinStringArray(cl_chars[i], defaultFormat)[0];
                        } else {// 如果字符不是中文,则不转换
                            hanyupinyin += cl_chars[i];
                        }
                    }
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    System.out.println("字符不能转成汉语拼音");
                }

                return hanyupinyin;
            }
}

利用快速排序实现

public class JMQuickSort {

    private static List<JMSortDes> sortDesList;
    
    public List<JMSortDes> getSortDesList() {
        return sortDesList;
    }
    public void setSortDesList(List<JMSortDes> sortDesList) {
        JMQuickSort.sortDesList = sortDesList;
    }
    
    public static <T> void quickSort(List<JMSortDes> sortDesList, List<T> objects) {
        
        JMQuickSort.sortDesList = sortDesList;
        
        sort(objects, 0, objects.size()-1);
    }
    //快速排序
    private static <T> void sort(List<T> objects, int left, int right){
            
            if (left >= right) {  return; }
            
            int i = left, j = right;
            T obj = objects.get(left);
            
            while(i < j) {
                
                while(i < j && objectCompara(obj, objects.get(j)) <= 0) {
                    j--;
                }
                T usj = objects.get(j);
                objects.remove(i);
                objects.add(i, usj);
                
                while(i < j && objectCompara(obj, objects.get(i)) >= 0) {
                    i++;
                }
                T usi = objects.get(i);
                objects.remove(j);
                objects.add(j, usi);
            }
            objects.remove(i);
            objects.add(i, obj);
            
            sort(objects, left, i-1);
            sort(objects, i+1, right);
        }
        
        static int objectCompara(Object o1, Object o2) {
            //大于0--->o1大
            for (int i = 0; i < JMQuickSort.sortDesList.size(); i++) {
                
                JMSortDes des = JMQuickSort.sortDesList.get(i);
                
                int compara = comparaTwoObj(des, o1, o2);
                
                if (compara != 0) {
                    return des.getIsAsc() == true ? compara : -compara;
                }else {
                   continue;    
                }
            }
            return 0;
     }
        private static int comparaTwoObj(JMSortDes des, Object o1, Object o2) {
            
            String value1 = null;
            String value2 = null;
             try {
                 value1 = hendleReturnValue(o1, des.getFildName());
                 value2 = hendleReturnValue(o2, des.getFildName());
                 
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int compara =  toHanyuPinyin(value1).compareTo(toHanyuPinyin(value2));
            
            return compara;
        }
        private static String hendleReturnValue(Object obj, String fildName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
            
            String methodName = "get" + fildName.substring(0, 1).toUpperCase() + fildName.substring(1);  
            
             Object obj1 = InvokeWithObj(obj, methodName, null);
             if (obj1 instanceof String) {
                 return  (String) obj1;
            }else {
                return  obj1 + "";
            }
        }
         private static String toHanyuPinyin(String ChineseLanguage){
             if (ChineseLanguage == null) {
                return "";
            }
                char[] cl_chars = ChineseLanguage.trim().toCharArray();
                String hanyupinyin = "";
                HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
                defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出拼音全部小写
                defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不带声调
                defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V) ;
                try {
                    for (int i=0; i<cl_chars.length; i++){
                        if (String.valueOf(cl_chars[i]).matches("[\u4e00-\u9fa5]+")){// 如果字符是中文,则将中文转为汉语拼音
                            hanyupinyin += PinyinHelper.toHanyuPinyinStringArray(cl_chars[i], defaultFormat)[0];
                        } else {// 如果字符不是中文,则不转换
                            hanyupinyin += cl_chars[i];
                        }
                    }
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    System.out.println("字符不能转成汉语拼音");
                }

                return hanyupinyin;
            }
         //根据对象,方法名,参数调用方法
           private static Object InvokeWithObj (Object obj, String methodName, Object ...args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
              
               Class[] prams = null;
               if (args != null) {
                   prams = new Class[args.length];
                   if (args != null) {
                       for (int i = 0; i < args.length; i++) {
                            prams[i] = args[i].getClass();
                        }
                    }
               }
                   Method method = null;
                   Class clazz = obj.getClass();
                   while (method == null && clazz != Object.class) {
                      try {
                         method = clazz.getDeclaredMethod(methodName, prams);   
                      } catch (NoSuchMethodException e) {
                         e.printStackTrace();
                         clazz = clazz.getSuperclass();
                     } 
               }
                    method.setAccessible(true); //设置可以访问私有方法
                    Object returnObj = method.invoke(obj, args);
                    return  returnObj;
             } 

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,504评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,898评论 1 300
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,218评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,322评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,693评论 3 290
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,812评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,747评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,476评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,700评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,190评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,541评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,206评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,129评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,903评论 0 199
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,894评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,748评论 2 274

推荐阅读更多精彩内容

  • 来源 http://blog.sina.com.cn/s/blog_56fd58ab0100qdzb.html 当...
    tenlee阅读 3,395评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,296评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,019评论 11 349
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,214评论 0 16
  • 昆明梁艳分享149天。网络初级五期。2017.10.13 今晚的读书会虽没有全程聆听,但有听的一段有位...
    诗心小鹿阅读 117评论 0 0