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

模型类列表按练习名称排序时忽略前导0的问题求助

解决Exercise列表按数值排序的问题

嘿,我来帮你搞定这个排序问题!你现在的代码直接用字符串比较,所以出现了不符合预期的结果——因为字符串是按字典序比较的,比如"Exercise 3"里的第三个字符是"3",它的ASCII码比"Exercise 01"里的"0"大,所以会排在前面,这就是为什么现有排序结果是Exercise 3, Exercise 6, Exercise 01, Exercise 02。

要实现按数字大小排序,我们需要提取每个Exercise名称里的数字部分,转成整数后再比较。这里有两种靠谱的实现方式:

方式一:针对固定前缀的简单提取

如果你的Exercise名称前缀固定是"Exercise ",可以直接替换掉前缀再转成整数:

Collections.sort(exerciseList, new Comparator<Exercise>() { 
    @Override 
    public int compare(Exercise ex1, Exercise ex2) {
        // 提取数字并转为整数
        Integer num1 = Integer.parseInt(ex1.getExercise().replace("Exercise ", ""));
        Integer num2 = Integer.parseInt(ex2.getExercise().replace("Exercise ", ""));
        // 按整数大小比较
        return num1.compareTo(num2);
    } 
});

方式二:用正则提取数字(更健壮)

如果前缀可能变化,或者数字位置不固定,推荐用正则表达式提取所有数字部分,这样兼容性更强:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 先定义正则模式,只需要初始化一次
Pattern numPattern = Pattern.compile("\\d+");

Collections.sort(exerciseList, new Comparator<Exercise>() { 
    @Override 
    public int compare(Exercise ex1, Exercise ex2) {
        // 提取第一个匹配到的数字
        Matcher matcher1 = numPattern.matcher(ex1.getExercise());
        matcher1.find();
        Integer num1 = Integer.parseInt(matcher1.group());
        
        Matcher matcher2 = numPattern.matcher(ex2.getExercise());
        matcher2.find();
        Integer num2 = Integer.parseInt(matcher2.group());
        
        return num1.compareTo(num2);
    } 
});

Java 8+ Lambda简化版

如果你的项目用Java 8或更高版本,还可以用Lambda表达式让代码更简洁:

exerciseList.sort((ex1, ex2) -> {
    Integer num1 = Integer.parseInt(ex1.getExercise().replace("Exercise ", ""));
    Integer num2 = Integer.parseInt(ex2.getExercise().replace("Exercise ", ""));
    return num1.compareTo(num2);
});

用上面的代码排序后,你的列表就会变成期望的Exercise 01, Exercise 02, Exercise 3, Exercise 6啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:39:53