如何基于Enum的自定义顺序对List<Status>对象进行排序
自定义状态列表排序实现方案
原代码存在的编译问题需先修正:
- 类声明
implements Comparable<Status>但未实现compareTo方法,可移除该接口声明或补充对应实现 - 类内定义字段为
private int requestStatus;,但getStatus()、setStatus()方法操作的是未定义的status变量,需统一字段名,示例统一修正为private int status;
方案一:在枚举中扩展排序权重(推荐)
核心思路:将排序优先级与原有业务存储的intValue解耦,后续调整排序规则只需修改枚举定义,维护成本低。
- 扩展
StatusEnum,新增sortOrder字段对应排序优先级(数值越小排序越靠前):
public enum StatusEnum { // 按目标排序优先级赋值:1=最靠前,5=最靠后 REQUESTED(0, 1), CANCELED(-1, 5), VALIDATED(10, 2), ONGOING(20, 3), FINISHED(30, 4); private int intValue; // 新增排序权重字段 private int sortOrder; private StatusEnum(int intValue, int sortOrder) { this.intValue = intValue; this.sortOrder = sortOrder; } public int getSortOrder() { return sortOrder; } public int getIntValue() { return intValue; } public String getName() { return this.name(); } public static StatusEnum getStatusFromEnum(int code) { for (StatusEnum status : StatusEnum.values()) { if (status.getIntValue() == code) { return status; } } return null; } public static StatusEnum getStatusFromString(String name) { for (StatusEnum status : StatusEnum.values()) { if (status.name().equalsIgnoreCase(name)) { return status; } } return null; } }
- 对
List<Status>执行排序:
import java.util.Comparator; import java.util.List; import java.util.Objects; // 对目标状态列表执行排序 statusList.sort(Comparator.comparingInt((Status status) -> { // 匹配当前状态对应的枚举 StatusEnum statusEnum = StatusEnum.getStatusFromEnum(status.getStatus()); // 兜底处理:未匹配到枚举的未知状态统一排到最末尾 return Objects.isNull(statusEnum) ? 999 : statusEnum.getSortOrder(); }));
方案二:外部维护排序映射(无需修改原有枚举)
如果不愿改动已上线的StatusEnum,可直接在排序逻辑中维护状态值与排序权重的映射关系:
import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; // 维护状态存储值 -> 排序权重的映射,权重越小越靠前 private static final Map<Integer, Integer> STATUS_SORT_RULE = Map.of( 0, 1, // Requested 10, 2, // Validated 20, 3, // Ongoing 30, 4, // Finished -1, 5 // Canceled ); // 执行排序 statusList.sort(Comparator.comparingInt((Status status) -> { Integer weight = STATUS_SORT_RULE.get(status.getStatus()); // 未匹配到规则的未知状态排到末尾 return Objects.isNull(weight) ? 999 : weight; }));
注意事项:
- 两种方案均做了非法状态兜底,不会因未知状态抛出空指针异常
- 排序为原地修改,直接作用于传入的
List<Status>,如需保留原列表顺序可先做拷贝再执行排序
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

