为何while循环外仅能获取数组最后一个元素?如何获取全部元素?
问题分析与解决方案
为什么循环外部只能拿到数组的最后一个元素?
核心问题出在循环嵌套的逻辑顺序错误:
- 你在外层写了
for(i=0;i<N;i++),内层又套了while(s.hasNext() && s2.hasNext())。当i=0时,while循环会一次性把s和s2里的所有元素都读完,而且每次读取都会把值赋给x[i]和y[i](也就是x[0]和y[0])——这就导致x[0]和y[0]被反复覆盖,最后只保留了最后一组读取的值。 - 等while循环结束后,
s和s2已经没有元素了,外层for循环的i递增到1、2...时,内层while根本不会执行,所以x[1]、y[1]这些数组位置要么是默认的初始值(比如0.0),要么完全没被赋值。你最后在循环外部看到的“最后一个元素”,其实是x[0]被覆盖后的最终值,其他位置都是无效的。
另外,你在while循环内部调用DoConv(x, y, M, L, N)也不合理——每次循环都重新计算整个数组的结果,但此时数组只有x[i]被赋值,其他位置都是无效的,结果自然不对。
如何在循环外部获取数组的所有元素?
关键是要让每一组读取的xx和yy对应数组的不同索引位置,而不是反复覆盖同一个索引。这里给你两种可行的修正方案:
方案一:调整循环顺序(更推荐)
把while循环放在外层,用计数器i控制数组的索引,直到数组填满或者没有元素可读:
int i = 0; // 同时限制数组长度和元素读取状态,避免数组越界或读取过多元素 while (i < N && s.hasNext() && s2.hasNext()) { String xx = s.next(); String yy = s2.next(); double val1 = Double.parseDouble(xx); double val2 = Double.parseDouble(yy); x[i] = val1; y[i] = val2; i++; } // 检查元素数量是否匹配 if (i < N) { System.out.println("文件中的元素数量不足。"); } else if (s.hasNext() || s2.hasNext()) { System.out.println("文件中的元素数量过多。"); } // 现在整个x、y数组都已填充完成,可在循环外部处理 double[] result = DoConv(x, y, M, L, N); for (i = 0; i < N; i++) { System.out.println(result[i]); }
方案二:用for循环逐个读取(适合确定元素数量正好为N的场景)
如果必须用for循环,要确保每次循环只读取一组元素,并且提前判断是否还有元素可读:
for (i = 0; i < N; i++) { if (s.hasNext() && s2.hasNext()) { String xx = s.next(); String yy = s2.next(); double val1 = Double.parseDouble(xx); double val2 = Double.parseDouble(yy); x[i] = val1; y[i] = val2; } else { System.out.println("文件中的元素数量不足。"); break; // 中断循环,避免处理无效的数组索引 } } // 循环外部处理完整数组 double[] result = DoConv(x, y, M, L, N); for (i = 0; i < N; i++) { System.out.println(result[i]); }
内容的提问来源于stack exchange,提问作者xShink
相关产品推荐
相关产品推荐

