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
相关产品推荐
相关产品推荐

