【问题标题】: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未使用。

标签: java loops


【解决方案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?),因为当您学习编写更复杂的代码时,一堆breakreturn 会使代码非常混乱且难以阅读。因此,您最好养成使用布尔值的习惯。

【讨论】:

  • 哦,我现在明白了
【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2016-02-06
      • 2012-09-27
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多