摘要:前言直接進入正題,閑的沒事把對對象集合排序進行了封裝,寫起來優雅一點,不用每次用的時候自己再一個比較器對象了。
前言
直接進入正題,閑的沒事把Java對對象集合排序進行了封裝,寫起來優雅一點,不用每次用的時候自己再new一個比較器對象了。
ListOrderUtil沒多少東西,就是下邊這點代碼!
import java.lang.reflect.Field; import java.util.*; public class ListOrderUtil使用案例{ private List mArrayList;//數據集合 private LinkedHashMap mOrderList = new LinkedHashMap<>();//所有的排序字段 private Class mClass;//當天T的Class public static int ORDER_ASC = 1;//正序排列 public static int ORDER_DESC = 2;//倒序排列 public ListOrderUtil(List arrayList, Class 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 order() { this.mArrayList.sort(new Comparator () { @Override public int compare(T o1, T o2) { Field field = null; int order = 0; for (Map.Entry 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; } }
先來看看不封裝的時候如何排序:
大量的邏輯處理代碼冗余......
public class Main { public static void main(String[] args) { //添加測試數據 ArrayListstudents = 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); //-------------不封裝的寫法----------------------------不堪入目啊!!!! //1、使用studentId正序排列 Collections.sort(students, new Comparator () { @Override public int compare(Students o1, Students o2) { return o1.getStudentId() - o2.getStudentId(); } }); //2、使用studentId和age進行多字段排序,studentId正序為首,若想等便以age進行倒序排列。 Collections.sort(students, new Comparator () { @Override public int compare(Students o1, Students o2) { int order = o1.getStudentId() - o2.getStudentId(); if (order == 0) { order = o2.getAge() - o1.getAge(); } return order; } }); //3、多字段排序 Collections.sort(students, new Comparator () { @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) { //添加測試數據 ArrayListstudents = 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 listOrderUtil = new ListOrderUtil<>(students, Students.class); //1、使用studentId正序排列 listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC).order(); //2、使用studentId和age進行多字段排序,studentId正序為首,若想等便以age進行倒序排列。 listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC) .setOrderField("age", ListOrderUtil.ORDER_DESC); //3、多字段排序 listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC) .setOrderField("age", ListOrderUtil.ORDER_DESC) .setOrderField("studentName", ListOrderUtil.ORDER_DESC) .order(); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77860.html
摘要:集合類主要負責保存盛裝其他數據,因此集合類也被稱為容器類。所有的集合類都位于包下。表示一組對象,這些對象也稱為的元素。成員方法把集合轉成數組迭代器,集合的專用遍歷方式之接口概述有序的,也稱為序列。 前言 在編程中,常常需要集中存放多個數據。從傳統意義上講,數組是我們的一個很好的選擇,前提是我們實現已經明確知道我們將要保存的對象的數量。 一旦在數組初始化時指定了數組長度,這個數組長度就...
摘要:數組就是一個簡單的線性序列,這使得元素訪問非常快速。堆區堆內存用來存放創建的對象和數組。堆內存中的實體不再被指向時,啟動垃圾回收機制,自動清除,這也是優于的表現之一中需要程序員手動清除。 showImg(https://segmentfault.com/img/remote/1460000019264541?w=600&h=242); 第三章 方法和數組 3.1 概述 還記得我們的He...
集合接口 核心集合接口封裝了不同類型的集合,如下圖所示,這些接口允許獨立于其表示的細節來操縱集合,核心集合接口是Java集合框架的基礎,如下圖所示,核心集合接口形成層次結構。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一種特殊的Collection,SortedSet是一種特殊的Set,依此類推,另請注意,層次結構...
摘要:集合框架重點理解用于存儲數據的容器。集合容器在不斷向上抽取過程中。出現了集合體系。,刪除將集合中的元素全刪除,清空集合。刪除集合中指定的對象。注意刪除成功,集合的長度會改變。作用用于取集合中的元素。是集合特有的迭代器。是單列集合是雙列集合 集合框架(重點理解):用于存儲數據的容器。特點:1:對象封裝數據,對象多了也需要存儲。集合用于存儲對象。2:對象的個數確定可以使用數組,但是不確定怎...
摘要:如下工廠類文件我們可以發現,通過工廠類的包裝,在調用工廠類方法構造對象時可以十分輕松地完成任務,而后面的其他任務則交由工廠類的靜態代碼塊完成。因此我們考慮把這部分代碼寫入工廠類,再生產過程前進行判斷,過程封裝進工廠類。 需要構造一個類的對象,我們通常會用new的方法來構造: A a = new A(); 但是如果隨著這個對象被創建的同時還必須進行其他相對復雜的操作,...
閱讀 2533·2021-10-09 09:44
閱讀 640·2019-08-30 15:44
閱讀 2994·2019-08-29 18:46
閱讀 1133·2019-08-29 18:38
閱讀 557·2019-08-26 10:44
閱讀 2431·2019-08-23 16:07
閱讀 1089·2019-08-23 15:38
閱讀 4079·2019-08-23 14:02