直接進入正題,閒的沒事把Java對對象集合排序進行了封裝,寫起來優雅一點,不用每次用的時候本身再new一個比較器對象了。java
沒多少東西,就是下邊這點代碼!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(); } }