Java中如何将含整数值的字符串列表按数值大小排序?
解决字符串数字按数值排序的问题
我看你现在遇到的核心问题是:把VALUE列里的数字字符串按字典序排序了,而不是按实际的整数大小排序——这就是为什么200600会排在110000600后面的原因,毕竟字符串比较是从左到右逐个字符对比的,"1"开头的字符串总会比"2"开头的小。
要实现按整数数值排序,同时保留列表的String类型(满足你后续代码的需求),只需要修改Collections.sort这一行,用自定义的比较器来实现数值对比:
修改后的排序代码
替换你原来的Collections.sort(data);,改成下面这段:
Collections.sort(data, (s1, s2) -> { try { // 将字符串转为Long类型,按数值大小比较 long num1 = Long.parseLong(s1); long num2 = Long.parseLong(s2); return Long.compare(num1, num2); } catch (NumberFormatException e) { // 如果遇到无法转为数字的字符串, fallback到原字符串排序,避免报错 return s1.compareTo(s2); } });
为什么这样可行?
- 这个Lambda表达式作为自定义比较器,会把每个字符串尝试转换为
Long,然后按数值大小进行升序排序,正好符合你期望的结果:200600,2600000,110000600,150000600,700000600 - 异常处理部分是为了鲁棒性:如果
VALUE列里不小心混入了非数字的字符串,代码不会崩溃,而是把这些异常字符串按原字典序排在后面(或者你也可以根据需求调整这部分逻辑,比如直接过滤掉非数字项) - 排序后的列表仍然是
List<String>类型,完全兼容你后续用StringBuilder拼接、转Long做判断的代码逻辑
验证效果
修改后,排序后的data列表就会按照数值从小到大排列,后续拼接sbValue的时候也会按正确的顺序处理每个限额值,和你期望的逻辑完全匹配。
内容的提问来源于stack exchange,提问作者Yeru
相关产品推荐
相关产品推荐

