如何解决根据对象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)
- 按照学生的结果的顺序对列表进行排序,顺序为“失败”,“通过”,“不可用”(不按字母顺序) 成绩不及格的学生应该排在榜首。然后“通过”,然后“不可用”
- 如果多个学生的成绩相同,则按 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 + '\'' +
'}';
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。