Проверка ввода Java для нескольких записей в одной строке с помощью сканера - PullRequest
0 голосов
/ 21 декабря 2018

Я использую Сканер для получения целочисленного ввода от пользователя.В этом случае целое число должно быть от 5 до 10 включительно.

Я работаю с этим кодом:

import java.util.Scanner;

public class valin {

    public static void main(String[] args) {

        int inputNumber;

        Scanner in = new Scanner(System.in);

        do {
            System.out.println("Enter a number between 5 and 10: ");

            while (!in.hasNextInt()) {
                System.out.println("That is not a number. Please try again: ");
                in.next();
            }

            inputNumber = in.nextInt();

            if (inputNumber < 5 || inputNumber > 10) {
                System.out.println("Needs to be a number between 5 and 10. Try again.");
            }

        } while (inputNumber < 5 || inputNumber > 10);

        System.out.println("You entered: " + inputNumber);
        in.close();

    }

}

Проблема, с которой я сталкиваюсь, заключается в том, что пользователь вводит более 1 ввода в строке.В этом случае мой код будет отображаться как:

Enter a number between 5 and 10: 
www eee
That is not a number. Please try again: 
That is not a number. Please try again: 
qqq 6
That is not a number. Please try again: 
You entered: 6  

Что мне нужно, если пользователь введет, например, «qqq 6» или любой «ввод ввода пробела», что код скажет пользователю, что он недействителен ичтобы ввести его снова.

Возможно ли это?

Ответы [ 5 ]

0 голосов
/ 21 декабря 2018

Это «более узкая» версия решения, предоставленная @James Baker, которая использует группу захвата в регулярном выражении и пытается использовать ресурсы

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    private static final Pattern INT_5_TO_10 = Pattern.compile("([5-9]|10)");

    private static int parse(String line) {
        Matcher m = INT_5_TO_10.matcher(line.trim());
        return m.matches() ? Integer.parseInt(m.group(1)) : -1;
    }

    public static void main(String[] args) {
        int inputNumber;
        try (Scanner in = new Scanner(System.in)) {
            System.out.println("Enter a number between 5 and 10: ");

            while (in.hasNextLine()) {
                String line = in.nextLine();
                inputNumber = parse(line);

                if (inputNumber > 0) {
                    System.out.println("You entered: " + inputNumber);
                } else {
                    System.out.println("That is not a number between 5 and 10. Please try again.");
                }
            }
        }
    }
}
0 голосов
/ 21 декабря 2018

Вот рабочая версия, перехватывающая NumberFormatException, как предлагают несколько других людей:

import java.util.Scanner;

public class valin {

  public static void main(String[] args)
  {
    Integer inputNumber = -1;

    Scanner in = new Scanner(System.in);

    System.out.println("Enter a number between 5 and 10: ");

    while(in.hasNextLine()){
      String line = in.nextLine().trim();

      try{
        inputNumber = Integer.parseInt(line);
      }catch (NumberFormatException nfe){
        System.out.println("That is not a number. Please try again.");
        continue;
      }

      if(inputNumber >= 5 && inputNumber <= 10){
        System.out.println("You entered: " + inputNumber);
        break;
      }else{
        System.out.println("That is not a number between 5 and 10. Please try again.");
      }
    }

    in.close();

  }

}
0 голосов
/ 21 декабря 2018

Вот альтернативный способ сделать это с помощью регулярных выражений:

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class valin {

  private static final Pattern INT_5_TO_10 = Pattern.compile("[5-9]|10");

  public static void main(String[] args)
  {
    int inputNumber;

    Scanner in = new Scanner(System.in);

    System.out.println("Enter a number between 5 and 10: ");

    while(in.hasNextLine()){
      String line = in.nextLine().trim();
      Matcher m = INT_5_TO_10.matcher(line);

      if(m.matches()){
        inputNumber = Integer.parseInt(line);   //Only neccessary if you want to use this later on, otherwise we don't need to parse the number
        System.out.println("You entered: " + inputNumber);
        break;
      }else{
        System.out.println("That is not a number between 5 and 10. Please try again.");
      }
    }

    in.close();

  }

}
0 голосов
/ 21 декабря 2018

Проблема с вашим кодом в строке

inputNumber = in.nextInt();

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

String input = in.nextLine();

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

inputNumber = Integer.parseInt(input);

, чтобы вы могли преодолеть вышеупомянутую проблему.

Код Integer.parseInt(input) может привести к NumberFormatException.Пожалуйста, обработайте необходимое исключение.

0 голосов
/ 21 декабря 2018

поместите вашу переменную "in" в переменную string [], затем проверьте для каждого элемента, является ли она целым числом

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