Продолжайте спрашивать, пока не получите правильное значение с 2D-массивами - PullRequest
1 голос
/ 30 января 2020

В настоящее время я работаю над небольшим проектом по курсу edX. Я придерживался одной вещи, принимая значения от пользователей и сохраняя их в 2d массиве. Тем не менее, значения должны быть в диапазоне, и поэтому мне нужно повторить то же самое, что необходимые условия выполнены.

Я сам нашел решение, но я не знаю, является ли это обычной практикой или есть лучший способ сделать это.

Позвольте мне объяснить;

Итак, у меня есть такой массив:

int[][] userCoordinates = new int[5][2];

Я хочу заполнить этот массив информацией о координатах пользователя , но координаты должны быть от 0 до 9.

Я сделал что-то вроде этого;

int coordinateValueX = 0, coordinateValueY = 0;
Scanner input = new Scanner(System.in);

for (int i = 0; i < userCoordinates.length; i++) {

 // X - Value

 for (int j = 0; j <= 0; j++) {
  System.out.print("Enter X coordinate for your " + (i + 1) + ". ship:");
  coordinateValueX = input.nextInt();

  if (gridCheck(coordinateValueX)) {
   j--;
  }
 }

 // Y - Value

 for (int j = 1; j <= 1; j++) {
  System.out.print("Enter Y coordinate for your " + (i + 1) + ". ship:");
  coordinateValueY = input.nextInt();

  if (gridCheck(coordinateValueY)) {
   j--;
  }
 }
}

И метод gridCheck таков:

public static boolean gridCheck(int coordinateValue) {
    boolean flag = false;
    if (coordinateValue > 9 || coordinateValue < 0) {
        System.err.println("Invalid grid, please give your coordinate again.");
        flag = true;
    }
    return flag;
}

Я пытался используя while-continue, но проблема в том, что когда пользователь задает неправильное значение Y, он снова запрашивает значение x, потому что переходит к следующему l oop.

Открыт для предложений, заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Ваша проблема не имеет ничего общего с массивами, все связано с вводом.

Создайте метод, который запрашивает значение у пользователя и не возвращает, пока не получит значение в определенном диапазоне, что-то как:

private int askForInt(Scanner scanner, String coordName, int max) {
    while (true) {
        System.out.print("Give your " + coordName + " coordinate: ");
        int i = input.nextInt();
        input.nextLine(); // clear new line from buffer
        if (i >= 0 && i <= max) {
            return i;
        }
        System.err.println("Please enter a number between 0 and " + max);
    }
}

Теперь ваш основной код становится простым и понятным. Не нужно уменьшать l oop переменные (обычно следует избегать изменения l oop переменных внутри al oop - это приводит к путанице при чтении кода), и вы можете сосредоточиться на основных логах c l oop без раздражения плохого ввода пользователя.

0 голосов
/ 30 января 2020

Ааа, это действительно здорово. Вы также научили меня, что я могу передать сканер методам. Из твоего поста я сделал что-то подобное, если я правильно понял. Пожалуйста, исправьте меня, если я ошибаюсь.

Scanner scanner = new Scanner(System.in);
    int[][] userCoordinates = new int[5][2];
    for (int i = 0; i < userCoordinates.length; i++) {
        for (int j = 0; j < userCoordinates[0].length; j++) {
            if(j == 0)
                userCoordinates[i][j] = validateCoordinate(scanner, "x");
                        if(j == 1)
                            userCoordinates[i][j] = validateCoordinate(scanner, "y");
        }
    }

Я думаю, что могу сделать этот бизнес gridCheck внутри valideCoordinate, но я не знаю, уменьшает ли это читабельность.

public static boolean gridCheck(int coordinateValue) {
    boolean flag = false;
    if (coordinateValue > 9 || coordinateValue < 0) {
        flag = true;
    }
    return flag;
}

Добавить параметр xory потому что я хочу подсказать, если его х или у.

public static int validateCoordinate(Scanner scanner, String xory){

    while(true){
        if(xory.equals("x")){
        System.out.print("Give your X coordinate: ");
        }else if (xory.equals("y")){
            System.out.print("Give your Y coordinate: ");
        }

        int coordinate = scanner.nextInt();
        if(!gridCheck(coordinate)){
            return coordinate;
        }else{
            System.err.println("Please give a valid coordinate.");
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...