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

rem*_*til 3 java sorting list arraylist java-11

我有一个Student(name, result, rollNo)对象列表。

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

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

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

最终结果应如下所示。

{"Joe", "Fail", "111"}
{"Matt", "Fail", "115"}
{"Sam", "Pass", "100"}
{"Ann", "Pass", "121"}
{"Moss", "Pass", "133"}
{"Gill", "Not available", "101"}
Run Code Online (Sandbox Code Playgroud)

Dig*_*ter 5

从 Java 8 开始,我们可以对多个字段进行流排序

当您想按优先级“失败”、“通过”、“不可用”排序时,一种替代方法是在学生中添加额外的字段。当没有自然顺序时,这将有助于确定排序的优先级。在此示例中,学生按“通过”、“失败”、“不可用”排序,然后按姓名排序,只是为了显示更多选项。

排序代码片段:

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

    List<Student> sortedStudents = students.stream()
            .sorted(compareByPriorityThenName)
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

上下文中的代码片段:

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", "Fail", "115"),
            new Student("Ann", "Pass", "121"),
            new Student("Moss", "Pass", "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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

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

在学生中添加字段:

private int priority;
Run Code Online (Sandbox Code Playgroud)

添加了在 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;
}
Run Code Online (Sandbox Code Playgroud)

上下文中的 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 + '\'' +
                '}';
    }
}
Run Code Online (Sandbox Code Playgroud)