You need to enable JavaScript to run this app. 如何基于Enum的自定义顺序对List<Status>对象进行排序
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Enum的自定义顺序对List<Status>对象进行排序

自定义状态列表排序实现方案

原代码存在的编译问题需先修正:

  • 类声明implements Comparable<Status>但未实现compareTo方法,可移除该接口声明或补充对应实现
  • 类内定义字段为private int requestStatus;,但getStatus()、setStatus()方法操作的是未定义的status变量,需统一字段名,示例统一修正为private int status;

方案一:在枚举中扩展排序权重(推荐)

核心思路:将排序优先级与原有业务存储的intValue解耦,后续调整排序规则只需修改枚举定义,维护成本低。

  1. 扩展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;
    }
}
  1. 对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 15:36:10