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

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);
    }
}

代码说明

  1. 输入流程拆分:将x和y的输入分为两个独立阶段,确保只有x输入为空时才终止程序,y输入为空只会触发重新请求。
  2. 无效输入处理:对于非数字输入,会提示用户并重新请求对应坐标,不会导致流程混乱。
  3. 计算逻辑补充:添加了最佳拟合线的计算代码,按照公式实现了m和b的计算,并处理了点数量不足的情况。
  4. 输入修剪:使用trim()处理输入,避免用户输入空格被误判为空行。

这样的实现完全符合你设想的三个场景:

  • 场景1:输入x=3、y=2,再输入空x,终止并计算。
  • 场景2:第一次输入空x,直接终止,提示点数量不足。
  • 场景3:输入x=3,输入空y(视为无效,继续请求y),输入y=1,再输入空x,终止并计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:45:51