Java:对含数值与字母的字母数字列表排序问题求助
搞定混合数字字符串与普通字符串的自定义排序问题
嘿,我太懂你这种头疼的感觉了——默认的Collections.sort()是按字符串字典序来排的,跟你想要的「数值升序+字母放最后」完全不是一回事!比如它会把"-2.2"排在"-22"前面(因为.的ASCII码比2小),字母串的位置也完全不符合预期。别急,咱们自定义个比较器就能完美解决这个问题。
先理清楚咱们要的排序规则
咱们的核心需求是:
- 所有能转成数字的字符串(不管是整数还是double),严格按数值大小升序排
- 像
"qqqq"这种纯字母(非数字)的字符串,统一扔到所有数字的后面;如果有多个字母串,你可以选按字典序排或者保持原顺序(我下面的例子里按字典序,你可以按需改)
直接上可运行的代码示例
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class MixedSortFix { public static void main(String[] args) { List<String> mixedList = new ArrayList<>(); mixedList.add("-2.2"); mixedList.add("2.2"); mixedList.add("2.2"); mixedList.add("-22"); mixedList.add("-22"); mixedList.add("-22"); mixedList.add("-1.1"); mixedList.add("qqqq"); // 用自定义比较器排序 Collections.sort(mixedList, new CustomMixedComparator()); System.out.println(mixedList); // 输出就是你要的结果:[-22, -22, -22, -2.2, -1.1, 2.2, 2.2, qqqq] } static class CustomMixedComparator implements Comparator<String> { @Override public int compare(String s1, String s2) { boolean s1IsNum = isNumeric(s1); boolean s2IsNum = isNumeric(s2); // 两个都是数字串?按数值比大小 if (s1IsNum && s2IsNum) { double num1 = Double.parseDouble(s1); double num2 = Double.parseDouble(s2); return Double.compare(num1, num2); } // s1是数字,s2不是?那s1排前面 else if (s1IsNum) { return -1; } // s2是数字,s1不是?那s2排前面(也就是s1往后站) else if (s2IsNum) { return 1; } // 俩都不是数字?按字符串默认顺序排(你也可以改成保持原顺序) else { return s1.compareTo(s2); } } // 辅助方法:判断字符串能不能转成数字 private boolean isNumeric(String str) { try { Double.parseDouble(str); return true; } catch (NumberFormatException e) { return false; } } } }
给你拆解下代码逻辑
isNumeric()方法:就是试着把字符串转成Double,转成功就是数字,转失败(抛异常)就不是——简单粗暴但好用compare()方法分四种情况处理:- 都是数字:用
Double.compare()做数值比较,保证升序 - 一个是数字一个不是:数字直接插队到前面
- 都不是数字:默认按字典序排,如果你想让它们保持原来的顺序,把这里改成
return 0就行(不过返回0会影响排序稳定性,自己权衡哈)
- 都是数字:用
一些小提醒
- 如果你的列表里有其他非数字串(比如"abc123"),这个逻辑也会把它们扔到最后
- 要是需要支持特殊数字格式(比如带逗号的
"1,000.5"),得改isNumeric()的解析逻辑,比如先把逗号去掉再转 - 相同数值的数字串(比如两个
"2.2"),排序后相对顺序会保留,因为Collections.sort()是稳定排序,这点放心
内容的提问来源于stack exchange,提问作者Karolis Gadeikis
相关产品推荐
相关产品推荐

