Java中如何给泛型为对象的List集合通过对象中某个字段进行排序?
在开发中,有时会碰到取最大值的业务,今天给大家分享个我在发开中常用的,给泛型为对象的List集合排序。
示例:
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 学生实体类
*
* @author xsykkm
* @date 2023/08/08
*/
@Data
@AllArgsConstructor
public class Student {
/**
* 姓名
*/
private String name;
/**
* 分数
*/
private Double score;
/**
* 初始化数据
*
* @return List<Student>
*/
public static List<Student> initializeStudents() {
List<Student> students = new ArrayList<>();
Student student1 = new Student("小明", 82.0);
Student student2 = new Student("小红", 91.5);
Student student3 = new Student("小军", 62.0);
students.add(student1);
students.add(student2);
students.add(student3);
return students;
}
}
现在有一个需求,要求只展示分数最高的学生。
@Test
public void test11() {
// 初始化学生对象
List<Student> studentList = Student.initializeStudents();
// 指定自定义的比较器,根据 score 字段从大到小进行排序
Comparator<Student> comparator = new Comparator<Student>() {
@Override
public int compare(Student student1, Student student2) {
Double score1 = student1.getScore();
Double score2 = student2.getScore();
// 现在是大到小排序,需要从小到大排序的话将score2和score1互换就行了
return Double.compare(score2, score1);
}
};
// 对 studentList 进行排序
studentList.sort(comparator);
// 这种方式也可行
// Collections.sort(studentList, comparator);
System.out.println(studentList);
}
结果为:
[Student(name=小红, score=91.5), Student(name=小明, score=82.0), Student(name=小军, score=62.0)]
这种方式对于时间排序也是可以的。比如获取最新时间的课表。
示例:
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 课表
*
* @author xsykkm
* @date 2023/08/08
*/
@Data
@AllArgsConstructor
public class Curriculum {
/**
* 课程名称
*/
private String courseName;
/**
* 上课时间
*/
private String classTime;
/**
* 初始化数据
*
* @return List<Student>
*/
public static List<Curriculum> initializeCurriculum() {
List<Curriculum> curriculumList = new ArrayList<>();
Curriculum curriculum1 = new Curriculum("数学", "2023-08-08 09:00:00");
Curriculum curriculum2 = new Curriculum("语文", "2023-08-08 09:00:01");
Curriculum curriculum3 = new Curriculum("英文", "2023-08-12 08:00:00");
curriculumList.add(curriculum1);
curriculumList.add(curriculum2);
curriculumList.add(curriculum3);
return curriculumList;
}
}
代码:
@Test
public void test12() {
List<Curriculum> curriculumList = Curriculum.initializeCurriculum();
// 使用匿名内部类实现 Comparator 接口
Comparator<Curriculum> comparator = new Comparator<Curriculum>() {
@Override
public int compare(Curriculum obj1, Curriculum obj2) {
LocalDateTime time1 = LocalDateTime.parse(obj1.getClassTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime time2 = LocalDateTime.parse(obj2.getClassTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 现在是大到小排序,需要从小到大排序的话将time2和time1互换就行了
return time2.compareTo(time1);
}
};
// 对 curriculumList 进行排序
curriculumList.sort(comparator);
// 这种方式也可行
// Collections.sort(curriculumList, comparator);
System.out.println(curriculumList);
}
结果为:
[Curriculum(courseName=英文, classTime=2023-08-12 08:00:00), Curriculum(courseName=语文, classTime=2023-08-08 09:00:01), Curriculum(courseName=数学, classTime=2023-08-08 09:00:00)]
我是开发小白,欢迎各位大佬交流。