- Проверка ввода с помощью java.util.Scanner
- ОТВЕТЫ
- Ответ 1
- Обзор методов Scanner.hasNextXXX
- Пример 1: Проверка положительных целых чисел
- Ссылки API
- Связанные вопросы
- Ссылки
- Пример 4. Использование двух Scanner сразу
- Резюме
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Input validation in java using Scanner
- Scanner Methods to Validate User Input
- Scanner Methods to get User Input
- Input validation using Scanner class
- Validate integer input using Scanner in Java
Проверка ввода с помощью java.util.Scanner
Я беру ввод пользователя с System.in с помощью java.util.Scanner . Мне нужно проверить вход для таких вещей, как:
- Это должно быть неотрицательное число
- Это должно быть алфавитная буква
- . и т.д.
Какой лучший способ сделать это?
ОТВЕТЫ
Ответ 1
Обзор методов Scanner.hasNextXXX
java.util.Scanner имеет много методов hasNextXXX , которые могут использоваться для проверки ввода. Вот краткий обзор всех из них:
- hasNext() — у него есть любой токен вообще?
- hasNextLine() — есть ли еще одна строка ввода?
- Для Java-примитивов
- hasNextInt() — у него есть токен, который можно разобрать в int ?
- Также доступны hasNextDouble() , hasNextFloat() , hasNextByte() , hasNextShort() , hasNextLong() и hasNextBoolean()
- В качестве бонуса также есть hasNextBigInteger() и hasNextBigDecimal()
- Интегральные типы также имеют перегрузки для указания оснований (например, шестнадцатеричных)
- hasNext(String pattern)
- hasNext(Pattern pattern) — это Pattern.compile перегрузка
Scanner способен к большему, включенному тем, что он основан на регулярном выражении. Важной особенностью является useDelimiter(String pattern) , которая позволяет определить, какой шаблон разделяет ваши токены. Существуют также методы find и skip , которые игнорируют разделители.
Следующее обсуждение будет поддерживать регулярное выражение как можно более простым, поэтому фокус остается на Scanner .
Пример 1: Проверка положительных целых чисел
Вот простой пример использования hasNextInt() для проверки положительного int на входе.
Scanner sc = new Scanner(System.in); int number; do < System.out.println("Please enter a positive number!"); while (!sc.hasNextInt()) < System.out.println("That not a number!"); sc.next(); // this is important! >number = sc.nextInt(); > while (number
Введите положительное число!
пять
Это не число!
-3
Введите положительное число!
5
Спасибо! Получил 5Заметьте, насколько проще Scanner.hasNextInt() использовать по сравнению с более подробными try/catch Integer.parseInt / NumberFormatException комбо. По контракту a Scanner гарантирует, что если он hasNextInt() , то nextInt() мирно предоставит вам int и не будет бросать никаких NumberFormatException / InputMismatchException / NoSuchElementException .
Связанные вопросы
Пример 2: Несколько hasNextXXX на одном и том же токене
Обратите внимание, что вышеприведенный фрагмент содержит инструкцию sc.next() для продвижения Scanner до тех пор, пока не будет hasNextInt() . Важно понимать, что ни один из методов hasNextXXX не продвигает Scanner мимо любого ввода!. Вы обнаружите, что если вы опустите это line из фрагмента, затем он перейдет в бесконечный цикл на недопустимом вводе!
- Если вам нужно пропустить вход "мусор", который не прошел тест hasNextXXX , вам необходимо заранее продвинуть Scanner (например, next() , nextLine() , skip и т.д.)).
- Если один тест hasNextXXX завершился с ошибкой, вы все равно можете проверить, возможно ли это hasNextYYY !
Здесь приведен пример выполнения нескольких тестов hasNextXXX .
Scanner sc = new Scanner(System.in); while (!sc.hasNext("exit"))
5
(int) 5
ложь
(boolean) false
бла
(String) blah
1.1
(двойной) 1.1
100000000000
(длинный) 100000000000
выходОбратите внимание, что порядок испытаний имеет значение. Если a Scanner hasNextInt() , то это также hasNextLong() , но это не обязательно true наоборот. Чаще всего вы хотите сделать более конкретный тест перед более общим тестом.
Пример 3: Проверка гласных
Scanner имеет множество расширенных функций, поддерживаемых регулярными выражениями. Вот пример его использования для проверки гласных.
Scanner sc = new Scanner(System.in); System.out.println("Please enter a vowel, lowercase!"); while (!sc.hasNext("[aeiou]")) < System.out.println("That not a vowel!"); sc.next(); >String vowel = sc.next(); System.out.println("Thank you! Got " + vowel);
Введите гласный, в нижнем регистре!
5
Это не гласный!
г
Это не гласный!
е
Спасибо! Получил eВ regex, как строковый литерал Java, шаблон "[aeiou]" - это так называемый "класс символов"; он соответствует любой из букв a , e , i , o , u . Обратите внимание, что это тривиально, чтобы сделать вышеупомянутый тест нечувствительным к регистру: просто укажите такой шаблон регулярного выражения на Scanner .
Ссылки API
- hasNext(String pattern) - возвращает true , если следующий токен совпадает с шаблоном, построенным из указанной строки.
- java.util.regex.Pattern
Связанные вопросы
Ссылки
Пример 4. Использование двух Scanner сразу
Иногда вам нужно сканировать строки за строкой, с несколькими токенами на линии. Самый простой способ сделать это - использовать два Scanner , где второй Scanner принимает nextLine() из первого Scanner в качестве входного. Вот пример:
Scanner sc = new Scanner(System.in); System.out.println("Give me a bunch of numbers in a line (or 'exit')"); while (!sc.hasNext("exit")) < Scanner lineSc = new Scanner(sc.nextLine()); int sum = 0; while (lineSc.hasNextInt()) < sum += lineSc.nextInt(); >System.out.println("Sum is " + sum); >
Дайте мне кучу чисел в строке (или "exit" )
3 4 5
Сумма составляет 12
10 100 млн. ДолларовСумма составляет 110
ждать, что? Сумма 0
ВыходВ дополнение к Scanner(String) constructor, также Scanner(java.io.File) и др.
Резюме
- Scanner предоставляет богатый набор функций, таких как hasNextXXX методы для проверки.
- Правильное использование hasNextXXX/nextXXX в комбинации означает, что Scanner будет НИКОГДА не вывести InputMismatchException / NoSuchElementException .
- Всегда помните, что hasNextXXX не продвигает Scanner мимо любого ввода.
- Не стесняйтесь создавать несколько Scanner , если это необходимо. Два простых Scanner часто лучше, чем один сложный Scanner .
- Наконец, даже если у вас нет планов использовать расширенные функции регулярного выражения, имейте в виду, какие методы основаны на регулярных выражениях, а какие нет. Любой метод Scanner , который принимает аргумент String pattern , основан на регулярном выражении.
- Совет: простой способ превратить любой String в литеральный шаблон - Pattern.quote it.
Ответ 2
Для проверки строк для букв вы можете использовать регулярные выражения, например:
Для проверки номеров и остановки сбой программы, у меня есть довольно простой класс, который вы можете найти ниже, где вы можете определить диапазон значений, которые вы хотите. Здесь
public int readInt(String prompt, int min, int max) < Scanner scan = new Scanner(System.in); int number = 0; //Run once and loop until the input is within the specified range. do < //Print users message. System.out.printf("\n%s >", prompt); //Prevent string input crashing the program. while (!scan.hasNextInt()) < System.out.printf("Input doesn't match specifications. Try again."); System.out.printf("\n%s >", prompt); scan.next(); > //Set the number. number = scan.nextInt(); //If the number is outside range print an error message. if (number < min || number >max) System.out.printf("Input doesn't match specifications. Try again."); > while (number < min || number >max); return number; >
Ответ 3
Здесь минималистский способ сделать это.
System.out.print("Please enter an integer: "); while(!scan.hasNextInt()) scan.next(); int demoInt = scan.nextInt();
Ответ 4
try < int i = Integer.parseInt(myString); if (i < 0) < // Error, negative input >> catch (NumberFormatException e) < // Error, not a number. >
В commons-lang библиотека CharUtils класс, который предоставляет методы isAsciiNumeric() , чтобы проверить, что символ является числом, и isAsciiAlpha() , чтобы проверить, что символ является буквой.
Ответ 5
Если вы разбираете строковые данные с консоли или аналогичные, лучший способ - использовать регулярные выражения. Подробнее об этом читайте здесь: http://java.sun.com/developer/technicalArticles/releases/1.4regex/
В противном случае, чтобы проанализировать int из строки, попробуйте Integer.parseInt(строка). Если строка не является числом, вы получите исключение. Кроме того, вы можете выполнить свои проверки на это значение, чтобы убедиться, что оно не является отрицательным.
String input; int number; try < number = Integer.parseInt(input); if(number >0) < System.out.println("You positive number is " + number); >> catch (NumberFormatException ex)
Чтобы получить строку только для символов, вам, вероятно, будет лучше зацикливаться на каждом символе, проверяющем цифры, используя, например, Character.isLetter(char).
String input for(int i = 0; i >
Ответ 6
что я пробовал, так это то, что сначала я взял целочисленный ввод и проверил, является ли его отрицательным или нет, если его отрицательный снова принимает вход
Scanner s=new Scanner(System.in); int a=s.nextInt(); while(a <0) < System.out.println("please provide non negative integer input "); a=s.nextInt(); >System.out.println("the non negative integer input is "+a);
Здесь вам нужно сначала взять ввод символа и проверить, дал ли пользователь символ или нет, если нет, а затем снова введите символ
char ch = s.findInLine(".").charAt(0); while(!Charcter.isLetter(ch)) < System.out.println("please provide a character input "); ch=s.findInLine(".").charAt(0); >System.out.println("the character input is "+ch);
Input validation in java using Scanner
In this post, we will see how to do input validation in java using Scanner class.
The Java Scanner class is used to get input from user. It provides several methods to get input of different types and to validate the input as well. Here we will see some of these methods that can be used to get user input and do the input validation in java.
Scanner Methods to Validate User Input
Method Description boolean hasNext(String pattern) It returns true if the next token matches the pattern constructed from the specified string. boolean hasNext(Pattern pattern) It returns true if the next complete token matches the specified pattern. boolean hasNextBigDecimal() It returns true if the next token in this scanner's input can be interpreted as a BigDecimal using the nextBigDecimal() method. boolean hasNextBigInteger() It returns true if the next token in this scanner's input can be interpreted as a BigInteger in the default radix using the nextBigInteger() method. boolean hasNextBigInteger(int radix) It returns true if the next token in this scanner's input can be interpreted as a BigInteger in the specified radix using the nextBigInteger() method. boolean hasNextBoolean() It returns true if the next token in this scanner's input can be interpreted as a boolean value using a case insensitive pattern created from the string "true|false". boolean hasNextByte() It returns true if the next token in this scanner's input can be interpreted as a byte value in the default radix using the nextByte() method. boolean hasNextByte(int radix) It returns true if the next token in this scanner's input can be interpreted as a byte value in the specified radix using the nextByte() method. boolean hasNextDouble() It returns true if the next token in this scanner's input can be interpreted as a double value using the nextDouble() method. boolean hasNextFloat() It returns true if the next token in this scanner's input can be interpreted as a float value using the nextFloat() method. boolean hasNextInt() It returns true if the next token in this scanner's input can be interpreted as an int value in the default radix using the nextInt() method. boolean hasNextInt(int radix) It returns true if the next token in this scanner's input can be interpreted as an int value in the specified radix using the nextInt() method. boolean hasNextLine() It returns true if there is another line in the input of this scanner. boolean hasNextLong() It returns true if the next token in this scanner's input can be interpreted as a long value in the default radix using the nextLong() method. boolean hasNextLong(int radix) It returns true if the next token in this scanner's input can be interpreted as a long value in the specified radix using the nextLong() method. boolean hasNextShort() It returns true if the next token in this scanner's input can be interpreted as a short value in the default radix using the nextShort() method. boolean hasNextShort(int radix) It returns true if the next token in this scanner's input can be interpreted as a short value in the specified radix using the nextShort() method. Scanner Methods to get User Input
Method Description String next(String pattern) It returns the next token if it matches the pattern constructed from the specified string. String next(Pattern pattern) It returns the next token if it matches the specified pattern. BigDecimal nextBigDecimal() It scans the next token of the input as a BigDecimal. BigInteger nextBigInteger() It scans the next token of the input as a BigInteger. BigInteger nextBigInteger(int radix) It scans the next token of the input as a BigInteger. boolean nextBoolean() It scans the next token of the input into a boolean value and returns that value. byte nextByte() It scans the next token of the input as a byte. byte nextByte(int radix) It scans the next token of the input as a byte. double nextDouble() It scans the next token of the input as a double. float nextFloat() It scans the next token of the input as a float. int nextInt() It scans the next token of the input as an int. int nextInt(int radix) It scans the next token of the input as an int. String nextLine() it advances this scanner past the current line and returns the input that was skipped. long nextLong() It scans the next token of the input as a long. long nextLong(int radix) It scans the next token of the input as a long. short nextShort() It scans the next token of the input as a short. short nextShort(int radix) It scans the next token of the input as a short. Input validation using Scanner class
We can do different type of input validation using different hasNextXXX() methods.
Validate integer input using Scanner in Java
We can use hasNextInt() method to check whether the input is integer and then get that using nextInt() method. See the example below.