You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何按指定字段实现非字母序的自定义排序与分组

实现逻辑:给每个action类型分配对应优先级数值,数值越小排序越靠前,按照优先级数值升序即可实现要求的顺序,以下是两种常用实现方案:

前提准备

首先为MyClass的action字段添加getter方法:

public String getAction() {
    return this.action;
}

方案1:Java 8+ 简洁实现(推荐)

使用优先级映射结合内置Comparator完成排序,可选择生成新列表或者直接修改原列表:

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 定义action优先级映射,数值越小排名越靠前
Map<String, Integer> actionPriority = Map.of(
    "DELETE", 1,
    "UPDATE", 2,
    "ADD", 3
);

// 方式1:生成新的排序后列表,不修改原列表
List<MyClass> sortedList = originalList.stream()
    .sorted(Comparator.comparingInt(item -> actionPriority.get(item.getAction())))
    .collect(Collectors.toList());

// 方式2:直接对原列表排序,无需生成新列表
originalList.sort(Comparator.comparingInt(item -> actionPriority.get(item.getAction())));

如果同类型action需要二次排序(比如按account字段字典序排序),追加排序规则即可:

originalList.sort(Comparator.comparingInt((MyClass item) -> actionPriority.get(item.getAction()))
    .thenComparing(MyClass::getAccount));

方案2:Java 7及更低版本实现

自定义Comparator完成排序:

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

Comparator<MyClass> actionComparator = new Comparator<MyClass>() {
    @Override
    public int compare(MyClass o1, MyClass o2) {
        int priority1 = getActionPriority(o1.getAction());
        int priority2 = getActionPriority(o2.getAction());
        return Integer.compare(priority1, priority2);
    }

    private int getActionPriority(String action) {
        if ("DELETE".equals(action)) {
            return 1;
        } else if ("UPDATE".equals(action)) {
            return 2;
        } else if ("ADD".equals(action)) {
            return 3;
        }
        // 未知action默认排到最后,可根据业务需求调整
        return 99;
    }
};

// 对列表排序
Collections.sort(originalList, actionComparator);

内容的提问来源于stack exchange,提问作者Rajesh Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:00:02