Как задать вопрос до получения ответа от сканера? - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь oop запрашивать координаты и получать данные со сканера. Я хочу попросить ввода, пока координаты не действительны. Однако я действительно новичок с 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), которая проверяет правильность. Как я могу исправить свой код?

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

Вы должны рассмотреть вариант выполнения l oop, поскольку вы хотите выполнить код один раз, независимо от того, выполнено ли условие. Затем в конце l oop вы можете проверить, выполнено ли условие. Если он не выполняется, он будет запущен снова. Например:

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[] неправильно. Если вы просто хотите вернуть String[], сгенерированный split(), вы должны вернуть эту переменную. Не создавать новый String[] (см. Приведенный выше пример).

Этот l oop (как и все циклы) также может быть выполнен с while(true), который прерывается или возвращается для правильного условия. Тем не менее, это иногда считается плохой практикой (см. Являются ли циклы while (true) такими плохими? ), потому что когда вы учитесь писать более сложный код, связка break или return Это может сделать код очень запутанным и трудным для чтения. Таким образом, вам лучше привыкнуть к логическим значениям.

1 голос
/ 14 февраля 2020

Вот как это может быть. С while(true) вы получаете вход. Если координаты действительны, он вернет их. Просто внедрите метод валидации так, как вы хотите, и все будет хорошо go.

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
}
0 голосов
/ 14 февраля 2020

Вы можете использовать метод рекурсии: вызов, который считывает координаты, проверяет их и снова вызывает сам, если проверка не удалась. Вот окончательный код моей реализации:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...