Java程序实现:读取点数据至x坐标为空行时终止的逻辑问题
问题描述
我正在完成一项算法练习,要求编写Java程序读取用户输入的点集:用户依次输入第一个x坐标、第一个y坐标,可持续输入坐标直至程序读取到x坐标为空行时停止。最后需以y = mx + b的形式输出最佳拟合线公式,将m和b替换为计算所得值,使用的计算公式如下:
我现在的困惑是:不知道如何实现「仅读取到x坐标为空行时停止请求坐标」的逻辑,同时想确认这样的需求是否合理?
我设想了三种输入场景:
场景1
3 --- 第1次输入(x坐标)
2 --- 第2次输入(y坐标)
BLANK --- 第3次输入,终止循环并执行计算。
场景2
BLANK --- 第1次输入(x坐标),终止循环,无法进行计算。
场景3
3 --- 第1次输入(x坐标)
BLANK --- 第2次输入,程序应继续请求y坐标。
1 --- 第3次输入(y坐标)
BLANK --- 第4次输入,终止循环并执行计算。
我尝试实现上述条件的代码如下:
Scanner sc = new Scanner(System.in); ArrayList<Integer> exes = new ArrayList<>(); ArrayList<Integer> ys = new ArrayList<>(); System.out.println("Please enter your x coordinate: "); String badNumber = null; Integer goodNumber = null; var counter = 0; while (!(badNumber = sc.nextLine()).isEmpty()) { //only leave when there is a blank line from the x coordinate try { goodNumber = Integer.parseInt(badNumber); if (counter % 2 == 0) { exes.add(goodNumber); } else { ys.add(goodNumber); } } catch (NumberFormatException e) { System.out.println("Please insert a valid number"); } counter++; if (counter % 2 == 0) { System.out.println("Please enter your x coordinate: "); } else { System.out.println("Please enter your y coordinate: "); } }
我不确定这段代码是否正确实现了需求,希望得到相关指导。
解决方案与指导
需求合理性确认
这个需求完全合理,它明确了终止输入的触发条件(仅当请求x坐标时输入空行才停止),同时允许用户在输入y坐标时输入空行(此时仅视为无效输入,继续请求y坐标),符合交互式输入的常见逻辑。
当前代码的问题
你的代码没有正确实现需求,核心问题在于:
- 循环条件
while (!(badNumber = sc.nextLine()).isEmpty())会在任何一次输入为空行时直接终止循环,不管当前是在请求x还是y坐标。比如场景3中,用户输入y坐标时的空行会直接触发循环终止,而不是继续请求y坐标。 counter的逻辑存在漏洞:如果用户输入了无效数字(触发NumberFormatException),counter依然会递增,导致后续的请求提示和坐标存储逻辑混乱。比如用户输入x时输了非数字,counter变成1,接下来会提示输入y,但实际上x坐标还没输入成功。
修正后的代码实现
我们可以将输入流程拆分为「请求x坐标」和「请求y坐标」两个独立的步骤,明确只有在请求x坐标时输入空行才终止程序:
import java.util.ArrayList; import java.util.Scanner; public class LineOfBestFit { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ArrayList<Integer> xCoords = new ArrayList<>(); ArrayList<Integer> yCoords = new ArrayList<>(); while (true) { // 请求x坐标 System.out.println("Please enter your x coordinate: "); String xInput = sc.nextLine().trim(); // 仅当x输入为空时终止循环 if (xInput.isEmpty()) { break; } // 解析x坐标 Integer x = null; try { x = Integer.parseInt(xInput); } catch (NumberFormatException e) { System.out.println("Invalid number, please enter a valid x coordinate."); continue; // 重新请求x坐标 } xCoords.add(x); // 请求y坐标,直到输入有效数字 Integer y = null; while (y == null) { System.out.println("Please enter your y coordinate: "); String yInput = sc.nextLine().trim(); try { y = Integer.parseInt(yInput); } catch (NumberFormatException e) { System.out.println("Invalid number, please enter a valid y coordinate."); } // 注意:这里即使y输入为空,也只会视为无效输入,继续请求y } yCoords.add(y); } // 检查是否有足够的点进行计算 if (xCoords.size() < 2) { System.out.println("Not enough points to calculate the line of best fit."); return; } // 计算m和b(按照给定公式实现) double n = xCoords.size(); double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0; for (int i = 0; i < n; i++) { int x = xCoords.get(i); int y = yCoords.get(i); sumX += x; sumY += y; sumXY += (double)x * y; sumX2 += (double)x * x; } double m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX); double b = (sumY - m * sumX) / n; // 输出结果,可根据需要调整小数位数 System.out.printf("y = %.2fx + %.2f%n", m, b); } }
代码说明
- 输入流程拆分:将x和y的输入分为两个独立阶段,确保只有x输入为空时才终止程序,y输入为空只会触发重新请求。
- 无效输入处理:对于非数字输入,会提示用户并重新请求对应坐标,不会导致流程混乱。
- 计算逻辑补充:添加了最佳拟合线的计算代码,按照公式实现了m和b的计算,并处理了点数量不足的情况。
- 输入修剪:使用
trim()处理输入,避免用户输入空格被误判为空行。
这样的实现完全符合你设想的三个场景:
- 场景1:输入x=3、y=2,再输入空x,终止并计算。
- 场景2:第一次输入空x,直接终止,提示点数量不足。
- 场景3:输入x=3,输入空y(视为无效,继续请求y),输入y=1,再输入空x,终止并计算。
内容的提问来源于stack exchange,提问作者lLauriix
相关产品推荐
相关产品推荐

