如何循环问题直到从扫描仪获得答案?
Posted
技术标签:
【中文标题】如何循环问题直到从扫描仪获得答案?【英文标题】:How to loop a question until getting the answer from scanner? 【发布时间】:2020-05-30 11:08:23 【问题描述】:我正在尝试循环询问坐标并从扫描仪获取输入。我想要求输入,直到坐标有效。但是,我对 java 真的很陌生,循环使我对这项任务感到困惑。 首先我应该打印一个控制台输出,要求玩家输入一对棋盘坐标。
如果输入是有效坐标,我会将坐标作为字符串数组返回。
如果输入不是有效的坐标,我应该打印一条错误消息,然后再次询问,直到我得到有效的坐标。
public static String[] positionQuery(int dim, Scanner test_in)
Scanner stdin = new Scanner(System.in);
System.out.println("Provide origin and destination coordinates.");
System.out.println("Enter two positions between A1-H8:");
String s1 = stdin.nextLine();
String[] coordinates = s1.split(" ");
String origin = coordinates[0];
String dest = coordinates[1];
while (!validCoordinate(origin, dim) && !validCoordinate(dest,dim))
System.out.println("ERROR: Please enter valid coordinate pair separated by space.");
String s2 = stdin.nextLine();
String[] coordinates2 = s2.split(" ");
String origin2 = coordinates[0];
String dest2 = coordinates[1];
return new String[0];
我创建了一个辅助函数validCoordinate(String, int)
来检查有效性。
如何修复我的代码?
【问题讨论】:
仅供参考,方法positionQuery()
的参数test_in
未使用。
【参考方案1】:
您应该考虑一个“do-while”循环,因为无论条件是否满足,您都希望运行一次代码。然后,在循环结束时,您可以检查条件是否满足。如果不满足,它将再次运行。例如:
public static String[] positionQuery(int dim)
boolean errorEncountered = false;
String[] coordinates;
Scanner stdin = new Scanner(System.in);
do
if(errorEncountered)
System.out.println("ERROR: Please enter valid coordinate pair separated by space.");
else
System.out.println("Provide origin and destination coordinates.");
System.out.println("Enter two positions between A1-H8:");
String s1 = stdin.nextLine();
coordinates = s1.split(" ");
String origin = coordinates[0];
String dest = coordinates[1];
if(!validCoordinate(origin, dim) || !validCoordinate(dest,dim) || coordinates.length != 2) //makes sure there's only 2 coords
errorEncountered = true;
else
errorEncountered = false;
while (errorEncountered);
return coordinates;
在这个例子中,我冒昧地删除了Scanner test_in
输入,因为你没有使用它。
我还注意到您返回的 String[]
错误。如果您只想返回由split()
生成的String[]
,则应该返回该变量。不创建新的String[]
(参见上面的示例)。
这个循环(像所有循环一样)也可以通过while(true)
来完成,它会在正确的条件下中断或返回。然而,这些有时被认为是不好的做法(参见Are "while(true)" loops so bad?),因为当您学习编写更复杂的代码时,一堆break
或return
会使代码非常混乱且难以阅读。因此,您最好养成使用布尔值的习惯。
【讨论】:
哦,我现在明白了【参考方案2】:事情就是这样。使用while(true)
,您可以获得输入。如果坐标有效,它将返回它们。只需按照您想要的方式实施验证方法即可。
public static String[] positionQuery(int dim)
Scanner scanner = new Scanner(System.in);
System.out.println("Provide origin and destination coordinates.");
System.out.println("Enter two positions between A1-H8:");
while(true)
String line = scanner.nextLine();
String[] coordinates = line.split(" ");
if(coordinates.length == 2) // valid input with just one space
String src = coordinates[0];
String dst = coordinates[1];
if(validCoordinate(src, dst, dim))
return coordinates;
System.out.println("ERROR: Please enter valid coordinate pair separated by space.");
/**
* checks the validity of source and destination
* @param src source
* @param dst destination
* @param dim
* @return true if the coordinates are valid, otherwise false
*/
private static boolean validCoordinate(String src, String dst, int dim)
// TODO
【讨论】:
【参考方案3】:您可以使用递归:读取坐标的调用方法验证它们并在验证失败时再次调用自己。这是我的实现的最终代码:
public class Main
public static void main(String[] args)
int dim = 0;
Scanner scanner = new Scanner(System.in);
positionQuery(dim, scanner);
private static String[] positionQuery(int dim, Scanner scanner)
System.out.println("Provide origin and destination coordinates.");
System.out.println("Enter two positions between A1-H8:");
return readAndValidateCoordinates(dim, scanner);//read coordinates while they will be valid
/**
* Reads coordinates from console and validates them.
* If validation validation failed the recursion of this method will be invoked
* @param dim
* @param scanner
* @return array of @link String coordinates
*/
private static String[] readAndValidateCoordinates(int dim, Scanner scanner)
String s1 = scanner.nextLine();
String[] coordinates = s1.split(" ");
String origin = coordinates[0];
String dest = coordinates[1];
if (validCoordinate(origin, dim) && validCoordinate(dest, dim))
return coordinates;
else
System.out.println("ERROR: Please enter valid coordinate pair separated by space.");
return readAndValidateCoordinates(dim, scanner); //read coordinates again
private static boolean validCoordinate(String origin, int dim)
//perform your validation
return true;
【讨论】:
以上是关于如何循环问题直到从扫描仪获得答案?的主要内容,如果未能解决你的问题,请参考以下文章