Java如何根據(jù)實(shí)體指定字段值對(duì)其List進(jìn)行排序詳解
本文記錄在開(kāi)發(fā)過(guò)程,如何使用Java對(duì)List中的實(shí)體指定的字段進(jìn)行排序。
一、先準(zhǔn)備個(gè)實(shí)體PO
public class Student { private String name; private String age; private String score; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getScore() { return score; } public void setScore(String score) { this.score = score; } }
二、簡(jiǎn)易版本,利用比較器來(lái)實(shí)現(xiàn)排序
public class SortUtil { public static void main(String[] args) { List<Student> students = new ArrayList<>(); Student studentA = new Student(); studentA.setName("a"); studentA.setAge("16"); studentA.setScore("95"); Student studentB = new Student(); studentB.setName("b"); studentB.setAge("16"); studentB.setScore("83"); Student studentC = new Student(); studentC.setName("c"); studentC.setAge("16"); studentC.setScore("90"); students.add(studentA); students.add(studentB); students.add(studentC); System.out.println("-----排序前----"); for (Student student : students) { System.out.println("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]"); } System.out.println(); //排序-------------比較器來(lái)實(shí)現(xiàn)排序 Collections.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { BigDecimal data1 = new BigDecimal(o1.getScore()); BigDecimal data2 = new BigDecimal(o2.getScore()); return data2.compareTo(data1); } }); //------------------------------ System.out.println("-----排序后----"); for (Student student : students) { System.out.println("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]"); } }
測(cè)試結(jié)果:
三、封裝成通用的方法類(lèi)調(diào)用
import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.*; /** * @ClassName: SortUtil * @Author: XIZI * @Description: 排序 */ public class SortUtil { private static Logger logger = Logger.getLogger(SortUtil.class); /** * 排序 * * @param list 需要排序的list * @param filedName 字段名 * @param ascFlag 是否升序 * @param clazz 排序的類(lèi) * @param <T> */ public static <T> void sort(List<T> list, String filedName, boolean ascFlag, Class<T> clazz) { //通過(guò)比較器來(lái)實(shí)現(xiàn)排序 list.sort(new Comparator<T>() { @Override public int compare(T o1, T o2) { String data1s = ""; String data2s = ""; Field[] fields = getAllFields(clazz); for (Field field : fields) { // 設(shè)置字段可訪問(wèn)(必須,否則報(bào)錯(cuò)) field.setAccessible(true); if (field.getName().equals(filedName)) { try { data1s = field.get(o1).toString(); data2s = field.get(o2).toString(); } catch (IllegalAccessException e) { logger.error("排序出現(xiàn)異常:", e); return 0; } break; } } BigDecimal data1 = new BigDecimal(data1s); BigDecimal data2 = new BigDecimal(data2s); if (ascFlag) { //升序 return data1.compareTo(data2); } else { //降序 return data2.compareTo(data1); } } }); } public static Field[] getAllFields(Class<?> clazz){ List<Field> fieldList = new ArrayList<>(); while (clazz != null && !clazz.getName().toLowerCase().equals("java.lang.object")){ fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()))); clazz = clazz.getSuperclass(); } Field[] fields = new Field[fieldList.size()]; return fieldList.toArray(fields); } }
測(cè)試用例:
public static void main(String[] args) { List<Student> students = new ArrayList<>(); Student studentA = new Student(); studentA.setName("a"); studentA.setAge("16"); studentA.setScore("95"); Student studentB = new Student(); studentB.setName("b"); studentB.setAge("16"); studentB.setScore("83"); Student studentC = new Student(); studentC.setName("c"); studentC.setAge("16"); studentC.setScore("90"); students.add(studentA); students.add(studentB); students.add(studentC); System.out.println("-----排序前----"); for (Student student : students) { System.out.println("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]"); } System.out.println(); //調(diào)用排序方法執(zhí)行降序 SortUtil.sort(students, "score", false, Student.class); System.out.println("-----排序后----"); for (Student student : students) { System.out.println("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]"); } }
測(cè)試結(jié)果如預(yù)期一致。
附:指定條件排序
實(shí)現(xiàn) List 排序有多種方法,本文總結(jié)以下幾種。
調(diào)用 list sort 方法,實(shí)現(xiàn)比較器接口進(jìn)行排序
package com.example.demo.help; import java.util.*; public class ListSortTest { public static void main(String[] args) { List<String> rules = new ArrayList<>(); rules.add("30003"); rules.add("20002"); rules.add("10001"); rules.add("40004"); rules.add("60006"); rules.add("50005"); Map<String, Integer> ruleUpper = new HashMap<>(); ruleUpper.put("10001", 1); ruleUpper.put("20002", 2); ruleUpper.put("30003", 3); ruleUpper.put("40004", 4); rules.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { return ruleUpper.getOrDefault(o1, Integer.MAX_VALUE) - ruleUpper.getOrDefault(o2, Integer.MAX_VALUE); } }); System.out.println(rules); // [10001, 20002, 30003, 40004, 60006, 50005] } }
調(diào)用 list sort 方法,通過(guò) lambda 表達(dá)式實(shí)現(xiàn)排序
package com.example.demo.help; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ListSortTest { public static void main(String[] args) { List<String> rules = new ArrayList<>(); rules.add("30003"); rules.add("20002"); rules.add("10001"); rules.add("40004"); rules.add("60006"); rules.add("50005"); Map<String, Integer> ruleUpper = new HashMap<>(); ruleUpper.put("10001", 1); ruleUpper.put("20002", 2); ruleUpper.put("30003", 3); ruleUpper.put("40004", 4); rules.sort((o1, o2) -> (ruleUpper.getOrDefault(o1, Integer.MAX_VALUE) - ruleUpper.getOrDefault(o2, Integer.MAX_VALUE))); System.out.println(rules); // [10001, 20002, 30003, 40004, 60006, 50005] } }
通過(guò) Collections sort 方法,實(shí)現(xiàn)比較器接口進(jìn)行排序
package com.example.demo.help; import java.util.*; public class ListSortTest { public static void main(String[] args) { List<String> rules = new ArrayList<>(); rules.add("30003"); rules.add("20002"); rules.add("10001"); rules.add("40004"); rules.add("60006"); rules.add("50005"); Map<String, Integer> ruleUpper = new HashMap<>(); ruleUpper.put("10001", 1); ruleUpper.put("20002", 2); ruleUpper.put("30003", 3); ruleUpper.put("40004", 4); Collections.sort(rules, new Comparator<String>() { @Override public int compare(String o1, String o2) { return ruleUpper.getOrDefault(o1, Integer.MAX_VALUE) - ruleUpper.getOrDefault(o2, Integer.MAX_VALUE); } }); System.out.println(rules); // [10001, 20002, 30003, 40004, 60006, 50005] } }
總結(jié)
到此這篇關(guān)于Java如何根據(jù)實(shí)體指定字段值對(duì)其List進(jìn)行排序的文章就介紹到這了,更多相關(guān)Java實(shí)體指定字段值對(duì)List排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot連接Nacos集群報(bào)400問(wèn)題及完美解決方法
這篇文章主要介紹了解決SpringBoot連接Nacos集群報(bào)400問(wèn)題?,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Hikari連接池使用SpringBoot配置JMX監(jiān)控實(shí)現(xiàn)
Hikari是Spring Boot默認(rèn)的數(shù)據(jù)庫(kù)連接池。區(qū)別于C3P0直接通過(guò)連接池對(duì)象獲取各項(xiàng)狀態(tài)指標(biāo),Hikari需要通過(guò)JMX來(lái)獲取。本文就詳細(xì)的來(lái)介紹一下,感興趣的可以了解一下2021-07-07Java學(xué)習(xí)之如何進(jìn)行JSON解析
JSON(JavaScript?Object?Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它算是JavaScript語(yǔ)言的一部分,與XML一樣都可以用于數(shù)據(jù)的存儲(chǔ)和傳輸,本文講給大家介紹如何進(jìn)行JSON解析,需要的朋友可以參考下2023-12-12解決MyEclipse中Maven設(shè)置jdk版本jdk1.8報(bào)錯(cuò)問(wèn)題
今天安裝了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一個(gè)maven項(xiàng)目,項(xiàng)目默認(rèn)是jdk1.5,改成jdk1.8后項(xiàng)目報(bào)錯(cuò)2018-10-10SpringKafka錯(cuò)誤處理(重試機(jī)制與死信隊(duì)列)
Spring Kafka提供了全面的錯(cuò)誤處理機(jī)制,通過(guò)靈活的重試策略和死信隊(duì)列處理,下面就來(lái)介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04Java設(shè)計(jì)模式之觀察者模式(Observer模式)
這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式(Observer模式),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Spring boot 配置多個(gè)redis的方法示例
這篇文章主要介紹了Spring boot 配置多個(gè)redis的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09