Java小数降序排序结果不符预期问题求助
解决字符串形式数值的降序排序问题
问题场景
需要将数组[-100, 50, 0, 56.6, 90, 0.12, .12, 02.34, 000.000]按降序排序,但现有代码输出结果[90, 56.6, 50, 02.34, 000.000, 0.12, 0, .12, -100]与预期[90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]不符,小数排序逻辑错误。
原代码如下:
import java.math.BigDecimal; import java.util.*; class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String[] s = new String[n + 2]; for (int i = 0; i < n; i++) { s[i] = sc.next(); } sc.close(); List <String> k = new ArrayList <> (); for (int i = 0; i < s.length - 2; i++) { k.add(s[i]); } Collections.sort(k, Collections.reverseOrder()); k.toArray(s); for (int i = 0; i < n; i++) { System.out.println(s[i]); } } }
问题原因
原代码使用Collections.reverseOrder()对字符串直接排序,这是字典序排序,而非数值排序。比如字符串"000.000"会排在"0.12"前面——字典序中'0'的优先级高于'.'后续字符,但从数值上看0.12明显大于0,导致排序结果不符合预期。
解决方案
通过BigDecimal将字符串转换为数值进行比较,同时保留原字符串的格式,排序时基于数值大小,最终输出原字符串内容。
修正后的代码:
import java.math.BigDecimal; import java.util.*; class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String[] s = new String[n]; for (int i = 0; i < n; i++) { s[i] = sc.next(); } sc.close(); // 基于BigDecimal数值进行降序排序,保留原字符串格式 List<String> list = Arrays.asList(s); Collections.sort(list, (a, b) -> { BigDecimal numA = new BigDecimal(a); BigDecimal numB = new BigDecimal(b); // 降序排序,用numB.compareTo(numA)实现从大到小 return numB.compareTo(numA); }); // 输出排序后的结果 for (String numStr : list) { System.out.println(numStr); } } }
代码说明
- 用
BigDecimal处理各种格式的字符串数值,既避免浮点数精度问题,又支持.12、02.34、000.000这类特殊格式的数值解析。 - 自定义排序逻辑,将字符串转为
BigDecimal后调用compareTo方法,通过numB.compareTo(numA)实现降序排序。 - 简化原代码中冗余的数组与列表转换逻辑,直接用
Arrays.asList处理输入数组,代码更简洁高效。
内容的提问来源于stack exchange,提问作者user21051695
相关产品推荐
相关产品推荐

