自学内容网 自学内容网

自定义Comparator 实现对象数据的排序

我们一般使用Comparator来比较两个基本数据类型的大小,并根据大小来实现排序,但是遇到定制的场景,就需要自定义

背景目的: 一个学生对象,有姓名、性别、分数列表3个属性,定义一个学生列表,实现分数列表不为null的学生对象排在前面

  • 定义学生对象
public class Student {
    String name;
    String sex;

    List<Integer> scoreList;

    public List<Integer> getScoreList() {
        return scoreList;
    }

    public void setScoreList(List<Integer> scoreList) {
        this.scoreList = scoreList;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", scoreList=" + scoreList +
                '}';
    }
 }
  • 自定义Comparator
public class StudentComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        if (s1.getScoreList() != null && s2.getScoreList() == null) {
            return -1;
        } else if (s1.getScoreList() == null && s2.getScoreList() != null) {
            return 1;
        }
        return 0;
    }
}

在 Java 中的 Comparator 接口中,有一个方法 compare(T o1, T o2) 用于比较两个对象的大小关系。返回值为 int 类型,具体含义如下:

如果 o1 小于 o2,则返回 -1;
如果 o1 大于 o2,则返回 1;
如果 o1 和 o2 相等,则返回 0。
因此,如果返回值为 -1,则表示 o1 小于 o2。

两个student对象分别是s1、s2 ,如果s1的分数列表scoreList不为null,s2的分数列表scoreList为空 ,则定义s1 小于 s2

  • 定义对象列表实现排序
 public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        List<Integer> scoreList = new ArrayList<>();
        scoreList.add(1);
        scoreList.add(2);
        scoreList.add(3);
        Student student = new Student();
        student.setName("ziyuan");
        student.setSex("F");
        student.setScoreList(scoreList);
        studentList.add(student);

        student = new Student();
        student.setName("ziyuan2");
        studentList.add(student);

        student = new Student();
        student.setName("ziyuan3");
        studentList.add(student);

        student = new Student();
        student.setName("ziyuan4");
        student.setSex("M");
        student.setScoreList(scoreList);
        studentList.add(student);

        System.out.println(studentList.toString());
        studentList = studentList.stream().sorted(new StudentComparator()).collect(Collectors.toList());
        System.out.println(studentList.toString());
    }

sort 是升序排序 ,所以实现分数列表不为null的学生对象排在前面

  • 运行结果
    在这里插入图片描述

关于sort方法的具体使用,可以参照我的另一篇博客:

Stream教程,入门即精通


原文地址:https://blog.csdn.net/qq_15283475/article/details/136151879

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!