本文记录在开发过程,如何使用Java对List中的实体指定的字段进行排序。
一、先准备个实体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;
}
}
二、简易版本,利用比较器来实现排序
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("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
}
System.out.println();
//排序-------------比较器来实现排序
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("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
}
}
测试结果:
三、封装成通用的方法类调用
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) {
//通过比较器来实现排序
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) {
// 设置字段可访问(必须,否则报错)
field.setAccessible(true);
if (field.getName().equals(filedName)) {
try {
data1s = field.get(o1).toString();
data2s = field.get(o2).toString();
} catch (IllegalAccessException e) {
logger.error("排序出现异常:", 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("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
}
System.out.println();
//调用排序方法执行降序
SortUtil.sort(students, "score", false, Student.class);
System.out.println("-----排序后----");
for (Student student : students) {
System.out.println("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
}
}
测试结果如预期一致。