根据对象JAVA 11中的值的自定义优先级对对象列表进行排序

问题描述

我有一个学生(姓名,结果,rollNo)对象的列表。

List.of(
                new Student("Sam","Pass","100"),new Student("Gill","Not available","101"),new Student("Joe","Fail","111"),new Student("Matt","115"),new Student("Ann","121"),new Student("Moss","133"),);

我需要根据以下要求对以上列表进行排序(我正在使用Java 11)

  1. 按照学生的结果的顺序对列表进行排序,顺序为“失败”,“通过”,“不可用”(不按字母顺序) 成绩不及格的学生应该排在榜首。然后“通过”,然后“不可用”
  2. 如果多个学生的成绩相同,则按 rollNo 的升序进行排序。

最终结果应如下所示。

{"Joe","111"}
{"Matt","115"}
{"Sam","100"}
{"Ann","121"}
{"Moss","133"}
{"Gill","101"}

解决方法

自Java 8以来,我们可以在多个字段上对流进行排序

当您要按优先级“失败”,“通过”,“不可用”排序时,一种选择是在学生中添加一个额外的字段。当没有自然顺序时,这将有助于确定排序的优先级。在此示例中,按“通过”,“失败”,“不可用”对学生进行排序,然后按名称排序,以显示更多选项。

排序代码段:

    Comparator<Student> compareByPriorityThenName =
            Comparator.comparing(Student::getPriority)
                    .thenComparing(Student::getName);

    List<Student> sortedStudents = students.stream()
            .sorted(compareByPriorityThenName)
            .collect(Collectors.toList());

上下文中的代码段:

public static void main(String []args){

    List<Student> students = List.of(
            new Student("Sam","Pass","100"),new Student("Gill","Not available","101"),new Student("Joe","Fail","111"),new Student("Matt","115"),new Student("Ann","121"),new Student("Moss","133")
    );

    Comparator<Student> compareByPriorityThenName =
            Comparator.comparing(Student::getPriority)
                    .thenComparing(Student::getName);

    List<Student> sortedStudents = students.stream()
            .sorted(compareByPriorityThenName)
            .collect(Collectors.toList());

    sortedStudents.forEach(System.out::println);
}

输出:

Student{name='Ann',result='Pass',rollNo='121',priority='1'}
Student{name='Moss',rollNo='133',priority='1'}
Student{name='Sam',rollNo='100',priority='1'}
Student{name='Joe',result='Fail',rollNo='111',priority='2'}
Student{name='Matt',rollNo='115',priority='2'}
Student{name='Gill',result='Not available',rollNo='101',priority='3'}

在学生中添加了字段:

private int priority;

添加了对Student类中的优先级进行排序的方法:

public int getPriority() {
    setPriority();
    return priority;
}

private int setPriority() {
    if(priority > 0) {
        return priority;
    }

    switch(result) {
    case "Pass":
        priority = 1;
        break;
    case "Fail":
        priority = 2;
        break;
    default:
        priority = 3;
    }
    return priority;
}

上下文中的方法getPriority():

public class Student {

    private final String name;
    private final String result;
    private final String rollNo;
    private int priority;

    public Student(String name,String result,String rollNo) {
        this.name = name;
        this.result = result;
        this.rollNo = rollNo;
        this.priority = 0;
    }

    public String getName() {
        return name;
    }

    public String getResult() {
        return result;
    }

    public String getRollNo() {
        return rollNo;
    }

    public int getPriority() {
        setPriority();
        return priority;
    }

    private int setPriority() {
        if(priority > 0) {
            return priority;
        }

        switch(result) {
        case "Pass":
            priority = 1;
            break;
        case "Fail":
            priority = 2;
            break;
        default:
            priority = 3;
        }
        return priority;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ",result='" + result + '\'' +
                ",rollNo='" + rollNo + '\'' +
                ",priority='" + priority + '\'' +
                '}';
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...