Java 从同一输入行读取多个值
我正试图编写一个程序,从标准输入计算两点之间的距离。但这两点必须从同一条线上读取。 例如(25,2)(26,15)。我被困在一个无法将这些输入放在一条线上的部件上。 到目前为止,我有: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
/*
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" );
}
}