美文网首页
Java对象排序

Java对象排序

作者: Touchs | 来源:发表于2017-11-17 14:44 被阅读41次

实现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;
             } 

}

相关文章

  • Java 排序

    概述 ​对Java对数组对象进行排序,Java对排序问题的处理。Java排序一般包括基础排序和Lambda Com...

  • Java对象排序

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

  • Java 比较器 和 包装类

    Java比较器 背景: 在Java中经常会涉及到多个对象的排序问题,那么就涉及到对象之间的比较 Java中的对象,...

  • java 对象数组排序

    java对象List集合的排序(基本类型相似); 方法一:使用for循环的方式来进行对象List集合的排序;方法二...

  • 策略模式

    Java中对List中对象列表某个字段升序排序

  • Java 8 中的Comparator 的用法

    Java 8 中的Comparator可以让我们很方便的实现排序的功能用法:对整数的列表升序排序 排序List对象...

  • 【Java】对象排序问题

    应用场景:ArrayList里存储一坨对象,按照其中的某个属性,对整个ArrayList进行排序 对包含一列som...

  • java对象比较排序

    问题:点击某个闭合多边形内部,比较点击点距离各条边的距离,取出距离最短的那条线的两个坐标点?思路:根据方法得到点到...

  • Java List对象排序

    升序 降序

  • Dart中的匿名函数

    匿名函数 简单示例:我们要对一个数列对象做排序,如在java中,我们要对一个List对象排序的话,我们调用sort...

网友评论

      本文标题:Java对象排序

      本文链接:https://www.haomeiwen.com/subject/heokvxtx.html