Как проверить, является ли следующий 3 ввод int, используя Scanner.hasNextInt () и цикл только в Java - PullRequest
0 голосов
/ 10 сентября 2018

Как я могу проверить, что следующие три входных пользователя дают значение типа int, как, скажем, есть три переменные,

  • var1
  • var2
  • var3

И я принимаю входные данные как,

Scanner sc = new Scanner (System.in); var1 = sc.nextInt(); var2 = sc.nextInt(); var3 = sc.nextInt();

Теперь, если я хочу использовать while(sc.hasNextInt()), чтобы определить, является ли следующий входint или нет, тогда он будет только проверять, является ли следующий вход для var1 целым или нет, и не проверяет другие переменные, var2 , var3 .Одно можно сделать с помощью while loop с if (condition).Например,

Scanner sc = new Scanner (System.in);
while (sc.hasNextInt()) {
   var1 = sc.nextInt();
   if (sc.hasNextInt()) {
      var2 = sc.nextInt();
      if (sc.hasNextInt()) {
         var3 = sc.nextInt();
      }
   }
 }

Но это выглядит долго и требует много написания.Для аналогичной проблемы, которую я видел для Язык C , есть метод для scanf(), который может добиться цели.Например,

while(scanf("%d %d %d", &var1, &var2 & var3) == 3) { // Statements here }

Итак, мой вопрос, есть ли такие функции, доступные в java Scanner.hasNextInt или Scanner.hasNext("regex").

Я также пробовал sc.hasNext("[0-9]* [0-9]* [0-9]*"), но на самом деле не работал.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Я пробовал с nextLine методом и использованием Pattern.Regex совпадает с 3 числами, разделенными пробелом.Думаю, так может быть;

Scanner scanner = new Scanner(System.in);

Pattern p = Pattern.compile("[0-9]+\\s[0-9]+\\s[0-9]+$");
while(!p.matcher(scanner.nextLine()).find()){
    System.out.println("Please write a 3 numbers which is separete with space");
}
System.out.println("Yes i got 3 numbers!");

Надеюсь, это поможет вам.

0 голосов
/ 10 сентября 2018

hasNext(regex) проверяет только один токен.Проблема заключается в том, что разделитель по умолчанию равен одному или нескольким пробелам, поэтому number number number не может быть одним токеном (разделитель - пробел - не может быть его частью).Так что sc.hasNext("[0-9]* [0-9]* [0-9]*") каждый раз заканчивает тестированием только одного number.Кстати, в вашем паттерне *, вероятно, должно быть +, поскольку каждое число должно иметь хотя бы одну цифру.

Чтобы пробелы были частью токена, нам нужно удалить их из шаблона разделителя.Другими словами, нам нужно заменить шаблон разделителя тем, который представляет только разделители строк, такие как \R ( больше информации ).Таким образом, если пользователь запишет данные в одну строку (будет использовать ввод только после третьего числа), эта строка будет рассматриваться как один токен и может быть проверена регулярным выражением.

Позже вам понадобитсяустановить разделитель обратно на один или несколько пробелов (\s+), потому что nextInt также работает на основе одного токена, поэтому без него мы бы попытались разобрать строку, например "1 2 3".

Scanner sc = new Scanner(System.in);
sc.useDelimiter("\\R");
System.out.print("Write 3 numbers (sepate them with space): ");
while(!sc.hasNext("\\d+ \\d+ \\d+")){
    String line = sc.nextLine();//IMPORTANT! Consume incorrect values
    System.out.println("This are not 3 numbers: "+line);
    System.out.print("Try again: ");
}
//here we are sure that there are 3 numbers
sc.useDelimiter("\\s+");//nextInt can't properly parse "num num num", we need to set whitespaces as delimiter

int var1 = sc.nextInt();
int var2 = sc.nextInt();
int var3 = sc.nextInt();

System.out.println("var1=" + var1);
System.out.println("var2=" + var2);
System.out.println("var3=" + var3);

Возможная проблема с этим решением заключается в том, что \d+ позволит пользователю указать номер любой длины, который может быть вне диапазона int.Если вы хотите принять только int, взгляните на Regex для действительного 32-разрядного целого числа со знаком .Вместо этого вы также можете использовать nextLong, поскольку long имеет больший диапазон, но все равно имеет максимальное значение.Чтобы принять любое целое число, независимо от его длины, вы можете использовать nextBigInteger().

...