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

java.util.Arrays.sort对double数组排序异常,求原因与解决方法

问题分析与解决

核心原因

你的代码在输入读取阶段存在逻辑漏洞,导致数组被意外填充默认值0.0,进而引发排序后数据错乱:

  • sc.nextInt()读取完n后,输入流中残留的换行符可能被后续hasNextDouble()误判,导致某次读取时hasNextDouble()返回false,此时inarr[i]未被赋值,保持double数组的默认初始值0.0。
  • 一旦出现一次读取失败,Scanner的指针不会前进,后续循环的hasNextDouble()都会返回false,最终数组中大量位置被填充为0.0,本该读取的数值完全没被读到,整个数组数据彻底错乱。
  • 你调试时误以为输入读取无异常,大概率是未覆盖到读取失败的位置,或者只打印了部分数组内容。

解决办法

方案1:修复输入读取逻辑,跳过残留换行

在读取n后添加sc.nextLine(),跳过输入流中剩余的换行符,避免干扰后续double读取:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.nextLine(); // 跳过n后面的换行符
    double[] inarr = new double[n];
    double sum = 0;
    
    for (int i = 0; i < n; i++) {
        // 直接读取,确保每个位置都获取到数值
        inarr[i] = sc.nextDouble();
        sum += inarr[i];
    }
    
    Arrays.sort(inarr);
    
    for (int i = 0; i < n; i++) {
        System.out.println(inarr[i]);
    }
}

方案2:强制使用美式Locale解析double

如果测试用例中的数值用逗号作为小数点分隔符(部分地区格式),设置Scanner的Locale确保正确解析:

import java.util.Locale;

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    sc.useLocale(Locale.US); // 强制以点号作为小数点分隔符
    int n = sc.nextInt();
    sc.nextLine();
    double[] inarr = new double[n];
    double sum = 0;
    
    for (int i = 0; i < n; i++) {
        inarr[i] = sc.nextDouble();
        sum += inarr[i];
    }
    
    Arrays.sort(inarr);
    
    for (int i = 0; i < n; i++) {
        System.out.println(inarr[i]);
    }
}

方案3:添加错误处理(可选)

添加try-catch块处理输入异常,避免程序静默失败:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.nextLine();
    double[] inarr = new double[n];
    double sum = 0;
    
    try {
        for (int i = 0; i < n; i++) {
            inarr[i] = sc.nextDouble();
            sum += inarr[i];
        }
    } catch (Exception e) {
        System.err.println("输入读取失败:" + e.getMessage());
        return;
    }
    
    Arrays.sort(inarr);
    
    for (int i = 0; i < n; i++) {
        System.out.println(inarr[i]);
    }
}

内容的提问来源于stack exchange,提问作者stanleysearles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:25:12