JAVA List的自定义排序

作者: 捣蛋大师cat | 来源:发表于2016-05-20 20:44 被阅读0次

    在单线程中,ArryList和HashMap的查找速度是相当快的。
    本人在工作中有利用ArryList<HashMap<String,String>>当作缓存中的数据库,今天写了排序功能,拿出来分享。
    不足之处欢迎指正。

    前言

    我们在使用一般排序的时候,会使用Collections.sort(List<T>)方法,T为基本数据类型或String。

    当List的参数为集合类或对象,或要实现自定义排序,就要使用Collections.sort(List<Object> list, Comparator<? super Object> c)方法,并且重写Comparator的compare()方法。

    以String类型的compareTo()方法为例,会比较两个字符串的ASCII码,并返回大小。
    比如arg0.compareTo(arg1):
    1.当arg0 < arg1,返回值小于0;
    2.当arg0 == arg1,返回值等于0;
    3.当arg0 > arg1,返回值大于0;

    当我们重写Comparator的compare()方法,同样通过上述三种返回值来决定排序顺序。

    Collections.sort()为升序排列,当Comparator.compare(arg0,arg1)返回值大于0,会改变arg0和arg1的排序。

    正文

    首先导入包:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.HashMap;
    import java.util.Collections;
    import java.util.Comparator;
    

    使用静态字段和方法。声明成员变量:

    private static String[] orderList;
    private static int[] orderTypeList;
    private static String order;
    

    1.简单排序

    1.1 以HashMap中的一个值为索引,对ArrayList进行升序排列:

    public static void sort(List<HashMap<String,String>> list,String name){ 
        order = name;
        Collections.sort(list, new Comparator<HashMap<String,String>>(){
            public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) { 
                return arg0.get(order).compareTo( arg1.get(order)); 
            } 
        });
        order = null;
    }
    

    1.2 以HashMap中的一个值为索引,对ArrayList进行降序排列:

    public static void descSort(List<HashMap<String,String>> list,String name){ 
        order = name;
        Collections.sort(list, new Comparator<HashMap<String,String>>(){
            public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) { 
                return arg1.get(order).compareTo( arg0.get(order));   //降序
            } 
        });
        order = null;
    }
    

    与1.1的差别只在return语句,arg0和arg1的先后顺序。

    1.3以HashMap中的多个值为索引,对ArrayList进行升序排列:

    public static void sort(List<HashMap<String,String>> list,String[] nameList){ 
        orderList = nameList;
        Collections.sort(list, new Comparator<HashMap<String,String>>(){
            public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) {
                int result = 0;
                for(int i = 0;i < orderList.length;i++){
                    result = arg0.get(orderList[i]).compareTo(arg1.get(orderList[i]));
                    if(result != 0){
                        break;
                    }
                }
                return result; 
            } 
        });
        orderList = null;
    }
    

    降序的差别同样只是arg0和arg1的先后顺序。

    1.4 使用方法举例:

    public static void main(String[] args) {
        String[] name = {"李雷","韩梅梅","莉莉","露西",};
        String[] age = {"30","24","26","26",};
        String[] weight = {"200","80","120","100",};
        String[] height = {"180","170","150","160",};
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
        for(int i = 0;i < 4;i ++){
            HashMap<String,String> map = new HashMap<String,String>();
            map.put("name", name[i]);
            map.put("age", age[i]);
            map.put("weight", weight[i]);
            map.put("height", height[i]);
            list.add(map);
        }
        My_Sort.sort(list, "name");  //按名字的ASCII码升序
        My_Sort.descSort(list, "age");  //按年龄的大小(ASCII码)降序
        My_Sort.sort(list, new String[]{"age","weight"});   //优先按年龄升序,年龄相同按体重升序
    }
    

    2.自定义排序

    2.1 假设1.4的例子,需要按年龄升序,年龄相同再按体重降序,体重相同再按身高升序,方法代码如下:

    /** 自定义排序,按照nameList的优先顺序,比较hashmap中的key排序
     * @param list
     * @param nameList 排序键值的优先顺序
     * @param typeList 对应值为1为降序,其他为升序
    */
    public static void sortByCustom(List<HashMap<String,String>> list,String[] nameList,int[] typeList){ 
        if(nameList.length != typeList.length){
            return ;  //参数不匹配,不进行排序
        }
        orderList = nameList;
        orderTypeList = typeList;
        Collections.sort(list, new Comparator<HashMap<String,String>>(){
            public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) {
                int result = 0;
                for(int i = 0;i < orderList.length;i++){
                    if(orderTypeList[i] == 1){
                        result = arg1.get(orderList[i]).compareTo(arg0.get(orderList[i]));
                    }else{
                        result = arg0.get(orderList[i]).compareTo(arg1.get(orderList[i]));
                    }
                    if(result != 0){
                        break;
                    }
                }
                return result; 
            } 
        });
        orderList = null;
        orderTypeList = null;
    }
    

    2.2 使用举例。1.4中的例子用法如下:

    //优先按年龄升序,再按体重降序,再按身高升序
    My_Sort.sortByCustom(list, new String[]{"age","weight","height"},new int[]{0,1,0});
    

    结束语

    1.本文的排序规则只是比较字符串的ASCII码,如果需要更复杂的规则,重写Comparator对象的compare()方法,本文已经重写四次,不再赘述。

    2.在写完2.2的new int[]{0,1,0} 后,有一种熟悉的感觉。想起来Android手机也是用{1,0,1,0}的数组来控制手机振动时间,无意中巧合,真是一种奇妙的感觉。

    相关文章

      网友评论

        本文标题:JAVA List的自定义排序

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