在对list排序的时候可能会碰到两个数据维度的自定义排序
比如一组学生数据,有考试状态,要按照考试状态为未考试(考试状态 0 未考试 1 已通过 2 未通过)的排在前面,其他的状态按照考试时间降序排列。
实体类
@Data
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
/**
* 考试状态 0 未考试 1 已通过 2 未通过
*/
private Integer status;
/**
* 考试时间
*/
@JSONField(format = "YYYY-mm-dd HH:mm:ss")
private LocalDateTime timeOfTest;
}
排序代码
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
list.add(new Student(2, "Sherry", 1, LocalDateTime.parse("2022-05-19T12:34:56")));
list.add(new Student(3, "Tom", 0,LocalDateTime.parse("2022-05-19T11:55:56")));
list.add(new Student(1, "Tom", 2, LocalDateTime.parse("2022-05-19T15:34:56")));
list.add(new Student(5, "Lily", 1, LocalDateTime.parse("2022-05-19T16:11:56")));
list.add(new Student(4, "Alisa", 1,LocalDateTime.parse("2022-05-19T22:00:56")));
List<Student> students=list.stream().sorted((p1,p2) ->{
//如果状态等于0(未考试),按照考试状态升序排
if (p1.getStatus().equals(0) || p2.getStatus().equals(0)){
return p1.getStatus()-p2.getStatus();
}else {
return p2.getTimeOfTest().compareTo(p1.getTimeOfTest());
}
}).collect(Collectors.toList());
System.out.println(JSON.toJSONString(students));
}
输出结果
[
{
"id":3,
"name":"Tom",
"status":0,
"timeOfTest":"2022-05-19T11:55:56"
},
{
"id":4,
"name":"Alisa",
"status":1,
"timeOfTest":"2022-05-19T22:00:56"
},
{
"id":5,
"name":"Lily",
"status":1,
"timeOfTest":"2022-05-19T16:11:56"
},
{
"id":1,
"name":"Tom",
"status":2,
"timeOfTest":"2022-05-19T15:34:56"
},
{
"id":2,
"name":"Sherry",
"status":1,
"timeOfTest":"2022-05-19T12:34:56"
}
]
这篇博客介绍了如何使用Java对包含考试状态和时间的学生数据进行自定义排序。首先,根据考试状态(0表示未考试,1表示已通过,2表示未通过)将未考试的学生排在前面,然后按照考试时间降序排列其他状态的学生。示例代码展示了如何利用Java 8的Stream API实现这一排序逻辑,并给出了排序后的结果。
6462

被折叠的 条评论
为什么被折叠?



