Java中如何给泛型为对象的List集合通过对象中某个字段进行排序?

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)]

我是开发小白,欢迎各位大佬交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值