排序比较器
/**
* 2024/2/20 16:37
* xxx
*/
@Slf4j
public class SortComparator<T> implements Comparator<T> {
Class<?> clazz = null;
Field sortField = null;
private String sort;
private String order;
public SortComparator(String sort, String order) {
this.sort = sort;
this.order = order;
}
@Override
public int compare(T t1, T t2) {
if (sortField == null) {
clazz = t1.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
if (declaredField.getName().equals(sort)) {
sortField = declaredField;
sortField.setAccessible(true);
}
}
}
if (sortField != null) {
try {
String v1 = (String) sortField.get(t1);
String v2 = (String) sortField.get(t2);
if ("ASC".equalsIgnoreCase(order)) {
return v1.compareTo(v2);
} else if ("DESC".equalsIgnoreCase(order)) {
return v2.compareTo(v1);
}
} catch (IllegalAccessException e) {
log.error("get field value: ", e);
}
}
return 0;
}
public void finish() {
if (sortField != null) {
sortField.setAccessible(false);
}
}
public void sorted(List<T> list, SortComparator<T> sortComparator) {
if (StringUtil.isBlank(sort) || StringUtil.isBlank(order)) {
return;
}
Collections.sort(list, sortComparator);
}
}
使用
@Data
public class PeoPle {
private String name;
private String time;
public static void main(String[] args) throws InterruptedException {
List<PeoPle> peoPleList = new ArrayList<>();
PeoPle peoPle1 = new PeoPle();
peoPle1.setTime(DateUtil.dateMilliSecondTimeNow());
TimeUnit.SECONDS.sleep(1);
PeoPle peoPle2 = new PeoPle();
peoPle2.setTime(DateUtil.dateMilliSecondTimeNow());
peoPleList.add(peoPle1);
peoPleList.add(peoPle2);
System.out.println("排序前: " + JSON.toJSONString(peoPleList));
SortComparator<PeoPle> sortComparator = new SortComparator<PeoPle>("time", "desc");
sortComparator.sorted(peoPleList);
sortComparator.finish();
System.out.println("排序后: " + JSON.toJSONString(peoPleList));
}
}
运行结果
排序前: [{"time":"2024-02-20 17:25:32.061"},{"time":"2024-02-20 17:25:33.102"}]
排序后: [{"time":"2024-02-20 17:25:33.102"},{"time":"2024-02-20 17:25:32.061"}]