Java如何根據(jù)實(shí)體指定字段值對其List進(jìn)行排序詳解
本文記錄在開發(fā)過程,如何使用Java對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;
}
}二、簡易版本,利用比較器來實(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();
//排序-------------比較器來實(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() + "]");
}
}
測試結(jié)果:

三、封裝成通用的方法類調(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 排序的類
* @param <T>
*/
public static <T> void sort(List<T> list, String filedName, boolean ascFlag, Class<T> clazz) {
//通過比較器來實(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è)置字段可訪問(必須,否則報(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);
}
}測試用例:
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() + "]");
}
}
測試結(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 方法,通過 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]
}
}通過 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í)體指定字段值對其List進(jìn)行排序的文章就介紹到這了,更多相關(guān)Java實(shí)體指定字段值對List排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù)的問題
Minio是Apache?License?v2.0下發(fā)布的對象存儲(chǔ)服務(wù)器,使用MinIO構(gòu)建用于機(jī)器學(xué)習(xí),分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載的高性能基礎(chǔ)架構(gòu)。這篇文章主要介紹了SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù),需要的朋友可以參考下2022-03-03
Java 動(dòng)態(tài)生成類和實(shí)例, 并注入方法操作示例
這篇文章主要介紹了Java 動(dòng)態(tài)生成類和實(shí)例, 并注入方法操作,結(jié)合實(shí)例形式分析了Java 動(dòng)態(tài)生成類和實(shí)例以及動(dòng)態(tài)注入相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
Java緩存Map設(shè)置過期時(shí)間實(shí)現(xiàn)解析
這篇文章主要介紹了Java緩存Map設(shè)置過期時(shí)間實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決
這篇文章主要介紹了java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

