点赞再看,养成习惯,大家好,我是辰兮!今天介绍如何根据多个字段以及排序规则进行数组排序。
前言
如图所示,需要按照此规则进行排序
一、代码示例
public class ScheduleSortByColumn {
private String name;
private String sortOrder;
}
public class SchedulePersonDTO {
private String personId;
private String unitCode;
private String unitName;
private String employeeId;
private String trueName;
private String jobId;
private String jobName;
}
private List<SchedulePersonDTO> personSortOrder(List<ScheduleSortByColumn> rowSetting, List<SchedulePersonDTO> persons) {
Comparator<SchedulePersonDTO> comparator = (p1, p2) -> 0;
for (ScheduleSortByColumn setting : rowSetting) {
try {
Field field = SchedulePersonDTO.class.getDeclaredField(setting.getName());
field.setAccessible(true);
Comparator<SchedulePersonDTO> ruleComparator = Comparator.comparing(person -> {
try {
return (Comparable) field.get(person);
} catch (IllegalAccessException e) {
return null;
}
});
if (Objects.isNull(ruleComparator)) {
continue;
}
if (DESC.equals(setting.getSortOrder())) {
ruleComparator = ruleComparator.reversed();
}
comparator = comparator.thenComparing(ruleComparator);
} catch (Exception e) {
log.info(String.format("方法personSortOrder没有此字段:%s", setting.getName()));
}
}
persons.sort(comparator);
return persons;
}
2.方法调用
List<ScheduleUserRowSetting> a = new ArrayList<>();
ScheduleUserRowSetting a1 = ScheduleUserRowSetting.builder().name("personId").sortOrder("asc").build();
ScheduleUserRowSetting a2 = ScheduleUserRowSetting.builder().name("unitCode").sortOrder("desc").build();
ScheduleUserRowSetting a3 = ScheduleUserRowSetting.builder().name("unitName").sortOrder("desc").build();
ScheduleUserRowSetting a4 = ScheduleUserRowSetting.builder().name("employeeId").sortOrder("asc").build();
a.add(a1);
a.add(a2);
a.add(a3);
a.add(a4);
List<SchedulePersonDTO> b = new ArrayList<>();
SchedulePersonDTO b1 = SchedulePersonDTO.builder().personId(1).unitCode(1).unitName(1).employeeId(1).trueName(1).build();
SchedulePersonDTO b2 = SchedulePersonDTO.builder().personId(1).unitCode(2).unitName(2).employeeId(2).trueName(2).build();
SchedulePersonDTO b3 = SchedulePersonDTO.builder().personId(1).unitCode(2).unitName(3).employeeId(3).trueName(3).build();
SchedulePersonDTO b4 = SchedulePersonDTO.builder().personId(1).unitCode(2).unitName(3).employeeId(4).trueName(4).build();
SchedulePersonDTO b5 = SchedulePersonDTO.builder().personId(1).unitCode(2).unitName(3).employeeId(4).trueName(5).build();
SchedulePersonDTO b6 = SchedulePersonDTO.builder().personId(1).unitCode(1).unitName(1).employeeId(1).trueName(1).build();
b.add(b1);
b.add(b2);
b.add(b3);
b.add(b4);
b.add(b5);
b.add(b6);
List<SchedulePersonDTO> schedulePersonDTOS = personSortOrder(a, b);
schedulePersonDTOS.forEach(System.out::println);
简单的示例,排序规则就为:首先按照personId进行升序排列,其次按照unitCode进行降序排列,等等。。。
总结
在这个示例中,我们创建了一个初始的比较器,它始终返回0,表示所有元素都是相等的。然后,对于每个排序规则,我们创建了一个新的比较器,并使用 Comparator.thenComparing
方法将其与现有的比较器结合起来。这个方法会返回一个新的比较器,它首先使用原始比较器,如果原始比较器认为两个元素相等,那么它就会使用新的比较器。这样,我们就可以根据多个字段进行排序了。