Java 从同一输入行读取多个值

Java 从同一输入行读取多个值,java,java.util.scanner,distance,Java,Java.util.scanner,Distance,我正试图编写一个程序,从标准输入计算两点之间的距离。但这两点必须从同一条线上读取。 例如(25,2)(26,15)。我被困在一个无法将这些输入放在一条线上的部件上。 到目前为止,我有: /* This Distance Program calculates the distance between two points */ package distance; /** * * @author */ import java.util.Scanner; public class Dist

我正试图编写一个程序,从标准输入计算两点之间的距离。但这两点必须从同一条线上读取。 例如(25,2)(26,15)。我被困在一个无法将这些输入放在一条线上的部件上。 到目前为止,我有:

/*
This Distance Program calculates the distance between two points
 */
package distance;

/**
 *
 * @author
 */
import java.util.Scanner;

public class Distance {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        System.out.println("X1");

        try {

            double x1 = input.nextDouble();

            double y1 = input.nextDouble();

            double x2 = input.nextDouble();

            double y2 = input.nextDouble();

            double dist = Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
            System.out.println("Distance between two points is: " + dist);
        } catch (Exception E) {
            System.out.println(E);
        }

    }

}

如果输入的格式为

String line = input.nextLine();
String[] points = line.split("\\s+");

if(points.length() == 4){
    double x1 = Double.parseDouble(points[0]);
    double y1 = Double.parseDouble(points[1]);
    double x2 = Double.parseDouble(points[2]);
    double y2 = Double.parseDouble(points[3]);
    //and the rest is the same
}
它的作用是从输入中读取
字符串。然后,它按字符串之间的空格分隔字符串(
\\s+
将字符串拆分为两个字符串之间有一个或多个空格的字符串)。字符串数组实际上是双精度数组,因此我们将它们转换为双精度数组


注意:如果输入的内容不是双精度的,则会出现错误。

这里的键是:您必须对用户应提供的确切格式进行特定的。是的,输入单个字符串并解析该内容是一个好主意,但是……您在问题中给出了这个示例
(25,2)(26,15)
。而该字符串将与Itamars解决方案一起工作

所以重点是:在你开始思考“如何解析用户输入”之前,你必须为自己澄清你期望/希望用户如何向你输入这两个坐标

意思:如果你的用户给你“n1 n2 n3 n4”(so 4数字);您可以使用\s+进行拆分。如果您的用户给您“n1,n2,n3,n4”,那么您应该在“,”上拆分

考虑到给定的格式“(x1,y1)(x2,y2)”,您可能首先在\s+上拆分(给您两个字符串;然后使用“,”再次拆分)。或者您了解正则表达式,因为它们使这样的解析更容易写下来

长话短说:不要处理不明确的要求


最后:对所使用的类型也要精确。您在代码中使用了双精度;但这真的是您所需要的吗?作为您的输入示例…只使用整数。当然,双精度始终有效;但当您希望用户使用整数时,您应该使用int或long!

作为@GhostCat指出,您可以使用检查用户输入格式。我实现了一个可能的解决方案

  • 要求用户以(x1,y1)(x2,y2)格式输入
  • 检查用户输入是否正确(如果不正确,则打印错误消息)
  • 如果格式正确,则进行计算:使用matcher计算距离,以获取捕获的子序列
  • 原始正则表达式: ^((-d+),(-d+)\s((-d+),(-d+)$

    正则表达式将逐字匹配括号、comas和空格,并将四个数字分组

    距离等级: 注意:由于您使用的是类,我建议使用原始乘法

    注2:在java中,前跟反斜杠(\)的字符是一个转义序列,对编译器有特殊意义。这就是为什么在代码中必须附加一个额外的转义序列

    I/O示例: 额外: 您还可以验证点的范围。如果您创建这样一个静态方法,则更清楚

    public static boolean rangeInclusive(int x, int y, int min, int max)
        {
            return x>=min && x<=max && y>=min && y<=max;    
        }
    

    以字符串形式阅读,然后从中提取数字。根据您的格式使用并解析输入哦,哇,我实际上忘记了o.o.格式的部分。谢谢much@ItamarGreen为了记录在案……如果你觉得我的答案至少有帮助的话……你是否故意省略了向上投票?一点也不,只是健忘。我众多的缺点之一sNobody是有缺陷的。永远不要这样想你。只要不断用积极的语言提醒自己你想做什么。就像“每当我发现一个答案时,就用Ghostcat对每个伟大的答案进行投票”(这特别容易,因为我所有的输入都很好;-)@Thrasher将int值传递给需要双精度的方法是可以的。另一个方向不是太多;-)请精确描述您的措辞。“5”可以看作int;不是双倍的,它会起作用;-)@我特别举了5只幽灵猫为例:现在感觉好多了,不错。为了不让我们的新手程序员负担过重,我没有给出一个正则表达式示例;但您的解决方案需要时间来介绍此主题。如果可以的话,我会投两次票。哈哈,其实我可以。那么,做一些具有类似效果的事情;-)非常感谢你的帮助。我对正则表达式不是很熟悉,但你的解释让我很清楚。但是如果我需要为一个例子设置一个限制,那么点数必须在-50到50之间,我该怎么做呢?在正则表达式上检查范围并不容易,你需要手动进行。但是您可以很容易地在所选的组上验证这一点(例如,
    matcher.group(1)
    ),如果您的范围不正确,则返回一个错误。@usnepalpplatform I在答案中添加了范围验证。祝你好运
    Insert two point to calculate the distance. Format: (x1,y1) (x2,y2) : 
    2 3 4 5
    Wrong input format
    
    Insert two point to calculate the distance. Format: (x1,y1) (x2,y2) : 
    (-2,-3) (-4,4)
    Good
    Distance: 7.280109889280518
    
    public static boolean rangeInclusive(int x, int y, int min, int max)
        {
            return x>=min && x<=max && y>=min && y<=max;    
        }
    
    if ( matcher.matches ( ) )
            {
                if( rangeInclusive ( Integer.parseInt ( matcher.group(1) ) , Integer.parseInt ( matcher.group(2) ), -50 , 50 ) &&
                        rangeInclusive ( Integer.parseInt ( matcher.group(3) ) , Integer.parseInt ( matcher.group(4) ), -50 , 50 ))
                {
                    double dist = Math.sqrt( Math.pow ( Long.parseLong ( matcher.group(3) ) - Long.parseLong ( matcher.group(1) ) , 2 ) + 
                            Math.pow ( Long.parseLong ( matcher.group(4) ) - Long.parseLong ( matcher.group(2) ) , 2 ) );
                    System.out.println ( "Distance: " + dist );
                }
                else
                {
                    System.out.println ( "Wrong range" );
                }
    
            }