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

Java中如何按自定义优先级排序ArrayList(非字母/数字排序)

实现珠玑妙算校验结果的排序

当然可以实现按black→white→blank的顺序对checked列表排序,下面是两种实用的实现方案:

方案一:自定义Comparator排序

直接通过Collections.sort()结合自定义比较器,为每种结果定义优先级值,通过比较优先级实现排序:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class MastermindDemo {
    public static void main(String[] args) {
        ArrayList<String> checked = new ArrayList<>();
        // 模拟校验生成的结果
        checked.add("blank");
        checked.add("black");
        checked.add("white");
        checked.add("black");
        checked.add("blank");

        // 执行排序
        Collections.sort(checked, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return Integer.compare(getPriority(a), getPriority(b));
            }

            // 为每种结果分配优先级:black优先级最高(0),其次white(1),blank最低(2)
            private int getPriority(String result) {
                switch (result) {
                    case "black":
                        return 0;
                    case "white":
                        return 1;
                    case "blank":
                        return 2;
                    default:
                        throw new IllegalArgumentException("无效的结果类型: " + result);
                }
            }
        });

        // 验证排序结果
        checked.forEach(System.out::println);
    }
}

方案二:基于枚举的排序(更易维护)

如果后续可能扩展结果类型或调整优先级,用枚举定义结果类型和优先级会更规范,可读性和扩展性更强:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

// 定义结果类型枚举,包含对应的字符串值和优先级
enum CheckResult {
    BLACK("black", 0),
    WHITE("white", 1),
    BLANK("blank", 2);

    private final String value;
    private final int priority;

    CheckResult(String value, int priority) {
        this.value = value;
        this.priority = priority;
    }

    public String getValue() {
        return value;
    }

    public int getPriority() {
        return priority;
    }

    // 根据字符串值获取对应的枚举实例
    public static CheckResult fromString(String value) {
        for (CheckResult result : CheckResult.values()) {
            if (result.value.equals(value)) {
                return result;
            }
        }
        throw new IllegalArgumentException("未知的结果值: " + value);
    }
}

public class MastermindDemo {
    public static void main(String[] args) {
        ArrayList<String> checked = new ArrayList<>();
        checked.add("blank");
        checked.add("black");
        checked.add("white");
        checked.add("black");
        checked.add("blank");

        // 基于枚举的优先级排序
        Collections.sort(checked, Comparator.comparingInt(s -> CheckResult.fromString(s).getPriority()));

        // 输出排序后的结果
        checked.forEach(System.out::println);
    }
}

两种方案都能实现需求:方案一适合快速实现,代码简洁;方案二更适合长期维护,后续调整优先级或新增结果类型时只需修改枚举即可,不需要改动排序逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:18:35