Java對象集合萬能排序封裝

前言

直接進入正題,閒的沒事把Java對對象集合排序進行了封裝,寫起來優雅一點,不用每次用的時候本身再new一個比較器對象了。java

ListOrderUtil

沒多少東西,就是下邊這點代碼!ide

import java.lang.reflect.Field;
import java.util.*;

public class ListOrderUtil<T> {
    private List<T> mArrayList;//數據集合
    private HashMap<String, Integer> mOrderList = new HashMap<>();//全部的排序字段
    private Class mClass;//當天T的Class
    public static int ORDER_ASC = 1;//正序排列
    public static int ORDER_DESC = 2;//倒序排列

    public ListOrderUtil(List<T> arrayList, Class<T> tClass) {
        this.mArrayList = arrayList;
        this.mClass = tClass;
    }

    /**
     * 設置排序字段(按照設置的前後順序對其進行排序)
     *
     * @param fieldName    字段名稱
     * @param orderPattern 排序模式
     * @return
     */
    public ListOrderUtil setOrderField(String fieldName, int orderPattern) {
        this.mOrderList.put(fieldName, orderPattern);
        return this;
    }

    /**
     * 對數據集合進行排序
     *
     * @return
     */
    public List<T> order() {
        this.mArrayList.sort(new Comparator<T>() {
            @Override
            public int compare(T o1, T o2) {
                Field field = null;
                int order = 0;
                for (Map.Entry<String, Integer> item : mOrderList.entrySet()) {
                    try {
                        field = mClass.getDeclaredField(item.getKey());
                        field.setAccessible(true);
                        if (field == null) {
                            throw new NoSuchFieldException(item.getKey());
                        }
                        if (item.getValue() == ORDER_ASC) {
                            order = field.get(o1).toString().compareTo(field.get(o2).toString());
                        } else {
                            order = field.get(o2).toString().compareTo(field.get(o1).toString());
                        }
                        if (order != 0) {
                            return order;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                return 0;
            }
        });
        return this.mArrayList;
    }
}

使用案例

首先是對象一枚!測試

import java.util.Comparator;

public class Students {
    private int studentId;
    private int age;
    private String studentName;

    public Students() {
    }

    public Students(int studentId, int age, String studentName) {
        this.studentId = studentId;
        this.age = age;
        this.studentName = studentName;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

}

先來看看不封裝的時候如何排序:this

大量的邏輯處理代碼冗餘......code

public class Main {

    public static void main(String[] args) {

        //添加測試數據
        ArrayList<Students> students = new ArrayList<>();

        Students students1 = new Students(1001, 22, "djk");
        Students students2 = new Students(1002, 18, "xxh");
        Students students3 = new Students(1003, 31, "wyd");
        Students students4 = new Students(1002, 18, "wxz");
        Students students5 = new Students(1005, 19, "sxn");
        Students students6 = new Students(1004, 32, "ljc");

        students.add(students1);
        students.add(students2);
        students.add(students3);
        students.add(students4);
        students.add(students5);
        students.add(students6);
        //-------------不封裝的寫法----------------------------不堪入目啊!!!!
        //一、使用studentId正序排列
        Collections.sort(students, new Comparator<Students>() {
            @Override
            public int compare(Students o1, Students o2) {
                return o1.getStudentId() - o2.getStudentId();
            }
        });
        //二、使用studentId和age進行多字段排序,studentId正序爲首,若想等便以age進行倒序排列。
        Collections.sort(students, new Comparator<Students>() {
            @Override
            public int compare(Students o1, Students o2) {
                int order = o1.getStudentId() - o2.getStudentId();
                if (order == 0) {
                    order = o2.getAge() - o1.getAge();
                }
                return order;
            }
        });
        //三、多字段排序
        Collections.sort(students, new Comparator<Students>() {
            @Override
            public int compare(Students o1, Students o2) {
                int order = o1.getStudentId() - o2.getStudentId();
                if (order == 0) {
                    order = o2.getAge() - o1.getAge();
                }
                if (order == 0) {
                    order = o2.getStudentName().compareTo(o1.getStudentName());
                }
                return order;
            }
        });

    }
}

再來看看封裝後的:對象

舒服多了......排序

public class Main {

    public static void main(String[] args) {

        //添加測試數據
        ArrayList<Students> students = new ArrayList<>();

        Students students1 = new Students(1001, 22, "djk");
        Students students2 = new Students(1002, 18, "xxh");
        Students students3 = new Students(1003, 31, "wyd");
        Students students4 = new Students(1002, 18, "wxz");
        Students students5 = new Students(1005, 19, "sxn");
        Students students6 = new Students(1004, 32, "ljc");

        students.add(students1);
        students.add(students2);
        students.add(students3);
        students.add(students4);
        students.add(students5);
        students.add(students6);

        //排序使用
        ListOrderUtil<Students> listOrderUtil = new ListOrderUtil<>(students, Students.class);
        //一、使用studentId正序排列
        listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC).order();

        //二、使用studentId和age進行多字段排序,studentId正序爲首,若想等便以age進行倒序排列。
        listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC)
                .setOrderField("age", ListOrderUtil.ORDER_DESC);

        //三、多字段排序
        listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC)
                .setOrderField("age", ListOrderUtil.ORDER_DESC)
                .setOrderField("studentName", ListOrderUtil.ORDER_DESC)
                .order();
    }
}
相關文章
相關標籤/搜索