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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:05:19