模型类列表按练习名称排序时忽略前导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
相关产品推荐
相关产品推荐

