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
相关产品推荐
相关产品推荐

